Alright, so from all of this what do I know?
Speed Differences: Flow increases speed differences Ablation
decreases speed differences Darkness increases speed differences
Distance increases speed differences Angles around 90 degrees have a
bigger difference in speed
Heading Differences: Fish are more aligned when they are around 90
degrees, slightly less in ablated fish
Synchronization: Darkness increases synchronization
NND: Darkness increases NND Flow decreases NND
Nearest Neighbor Bearing: In darkness fish are more in front or
behind In flow fish are more in positioned alongside each other
Sets up the functions that will be used later
rad2deg <- function(rad) {(rad * 180) / (pi)}
deg2rad <- function(deg) {(deg * pi) / (180)}
round_any <- function(x, accuracy, f=round){f(x/ accuracy) * accuracy}
ang_mean <- function(x){rad2deg(atan2(mean(sin(deg2rad(x))),mean(cos(deg2rad(x)))))}
fold_angle_0_360_to_0_180 <- function(x){abs(abs(x-180)-180)}
fold_angle_neg_180_180_to_neg_90_90 <- function(x){ifelse(x > 90,90-abs(90-x),ifelse(x < -90, -90+abs(-90-x), x))}
min_n <- function(x,n){sort(x)[1:n]}
max_n <- function(x,n){sort(x,decreasing = TRUE)[1:n]}
Reads in the data and alters it as needed
comp_data <- read.csv("Fish_Comp_Values.csv")
comp_data <- na.omit(comp_data)
comp_data <- comp_data %>% mutate(Flow = ifelse(Flow == "0", "Still Water", "Flowing Water (2 BL/s)")) %>%
mutate(Ablation = ifelse(Ablation == "N", "No Ablation", "Ablated")) %>%
mutate(Darkness = ifelse(Darkness == "N", "Light", "Dark")) %>%
filter(Distance <= 4) %>%
filter(abs(Speed_Diff) <= 6) %>%
#mutate(Speed_Diff = abs(Speed_Diff)) %>%
mutate(rad_Heading = deg2rad(Heading_Diff)) %>%
mutate(sin_Heading = sin(rad_Heading), cos_Heading = cos(rad_Heading)) %>%
#mutate(fold_heading_diff = abs(fold_angle_neg_180_180_to_neg_90_90(Heading_Diff))) %>%
mutate(Is_Aligned = ifelse(Heading_Diff < 30, 1, 0)) %>%
mutate(Is_Reversed = ifelse(Heading_Diff > 150, 1, 0)) %>%
separate(Fish, c("Fish1", "Fish2"),sep="x") %>%
mutate(Flow = factor(Flow), Ablation = factor(Ablation), Darkness = factor(Darkness)) %>%
mutate(Flow = fct_relevel(Flow, c("Still Water","Flowing Water (2 BL/s)"))) %>%
mutate(Ablation = fct_relevel(Ablation, c("No Ablation","Ablated"))) %>%
mutate(Darkness = fct_relevel(Darkness, c("Light","Dark"))) %>%
mutate(rad_Angle = deg2rad(Angle)) %>%
mutate(sin_Angle = sin(rad_Angle), cos_Angle = cos(rad_Angle)) %>%
mutate(Flow_Ablation = factor(paste(Flow,Ablation,sep=", "))) %>%
mutate(Flow_Darkness = factor(paste(Flow,Darkness,sep=", "))) %>%
mutate(Flow_Ablation_Darkness = factor(paste(Flow,Ablation,Darkness,sep=", ")))
#mutate(Angle = fold_angle_0_360_to_0_180(Angle))
sum_comp_data <- comp_data %>% mutate(X_Distance = round_any(X_Distance,0.25),
Y_Distance = round_any(abs(Y_Distance),0.25)) %>%
group_by(Flow,Ablation,Darkness,X_Distance,Y_Distance) %>%
summarise(Speed_Diff = mean(Speed_Diff),
Heading_Diff = ang_mean(Heading_Diff),
Sync = mean(Sync),
#Fold_Heading_Diff = mean(fold_heading_diff),
Is_Aligned = mean(Is_Aligned),
Is_Reversed = mean(Is_Reversed))
`summarise()` has grouped output by 'Flow', 'Ablation', 'Darkness', 'X_Distance'. You can override using the `.groups` argument.
comp_data_switch_fish <- comp_data %>% mutate(Fish3 = Fish1) %>%
mutate(Fish1 = Fish2) %>%
mutate(Fish2 = Fish3) %>%
select(-c(Fish3))
comp_data_NND <- bind_rows(comp_data, comp_data_switch_fish) %>% group_by(Year,Month,Day,Trial,Fish1,Tailbeat_Num) %>%
filter(Distance == min(Distance)) %>%
ungroup()
comp_data_near_3 <- bind_rows(comp_data, comp_data_switch_fish) %>% group_by(Year,Month,Day,Trial,Fish1,Tailbeat_Num) %>%
slice_min(Distance, n = 3) %>%
ungroup() %>%
distinct(Distance, .keep_all= TRUE)
#Basic Stats
speed_anova <- aov(Speed_Diff ~ Flow + Ablation + Darkness + Flow:Ablation + Flow:Darkness, data = comp_data_NND)
Anova(speed_anova)
Anova Table (Type II tests)
Response: Speed_Diff
Sum Sq Df F value Pr(>F)
Flow 2.41 1 3.8841 0.048843 *
Ablation 0.94 1 1.5189 0.217885
Darkness 1.51 1 2.4373 0.118591
Flow:Ablation 1.73 1 2.7848 0.095275 .
Flow:Darkness 6.13 1 9.8771 0.001691 **
Residuals 1731.81 2792
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
heading_anova <- aov(Heading_Diff ~ Flow + Ablation + Darkness + Flow:Ablation + Flow:Darkness, data = comp_data_NND)
Anova(heading_anova)
Anova Table (Type II tests)
Response: Heading_Diff
Sum Sq Df F value Pr(>F)
Flow 16270 1 1.6949 0.1931
Ablation 1799 1 0.1874 0.6651
Darkness 4829 1 0.5030 0.4782
Flow:Ablation 1864 1 0.1941 0.6595
Flow:Darkness 7960 1 0.8292 0.3626
Residuals 26802314 2792
sync_anova <- aov(Sync ~ Flow + Ablation + Darkness + Flow:Ablation + Flow:Darkness, data = comp_data_NND)
Anova(sync_anova)
Anova Table (Type II tests)
Response: Sync
Sum Sq Df F value Pr(>F)
Flow 0.170 1 2.6935 0.10087
Ablation 0.111 1 1.7491 0.18610
Darkness 0.409 1 6.4561 0.01111 *
Flow:Ablation 0.119 1 1.8786 0.17060
Flow:Darkness 0.083 1 1.3158 0.25145
Residuals 176.696 2792
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
dist_anova <- aov(Distance ~ Flow + Ablation + Darkness + Flow:Ablation + Flow:Darkness, data = comp_data_NND)
Anova(dist_anova)
Anova Table (Type II tests)
Response: Distance
Sum Sq Df F value Pr(>F)
Flow 4.29 1 9.2920 0.002323 **
Ablation 0.01 1 0.0165 0.897889
Darkness 81.34 1 176.0312 < 2.2e-16 ***
Flow:Ablation 0.26 1 0.5650 0.452325
Flow:Darkness 4.73 1 10.2324 0.001395 **
Residuals 1290.12 2792
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
angle_anova <- aov(Angle ~ Flow + Ablation + Darkness + Flow:Ablation + Flow:Darkness, data = comp_data_NND)
Anova(angle_anova)
Anova Table (Type II tests)
Response: Angle
Sum Sq Df F value Pr(>F)
Flow 4064 1 0.4125 0.5207449
Ablation 642 1 0.0651 0.7985532
Darkness 131214 1 13.3174 0.0002678 ***
Flow:Ablation 3812 1 0.3869 0.5339723
Flow:Darkness 20951 1 2.1265 0.1448873
Residuals 27508911 2792
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Just nearest Fish Speed Diff
comp_data_near_1 <- bind_rows(comp_data, comp_data_switch_fish) %>% group_by(Year,Month,Day,Trial,Fish1,Tailbeat_Num) %>%
slice_max(Distance, n = 1) %>%
ungroup() %>%
distinct(Distance, .keep_all= TRUE)
speed_anova_nn <- aov(Speed_Diff ~ Flow + Ablation + Darkness + Flow:Ablation + Flow:Darkness, data = comp_data_near_1)
Anova(speed_anova_nn)
Anova Table (Type II tests)
Response: Speed_Diff
Sum Sq Df F value Pr(>F)
Flow 0.95 1 1.2883 0.2565
Ablation 0.49 1 0.6671 0.4141
Darkness 1.82 1 2.4620 0.1168
Flow:Ablation 0.75 1 1.0157 0.3137
Flow:Darkness 0.09 1 0.1173 0.7320
Residuals 1564.53 2122
my_comparisons <- list( c("No Ablation, Light", "No Ablation, Dark"))
ggplot(comp_data_near_1, aes(x = interaction(Ablation,Darkness,sep=", "), y = Speed_Diff, fill = interaction(Ablation,Darkness,sep=", ")))+
geom_violin(outlier.shape = NA) +
guides(fill = guide_legend(title = "Condition")) +
scale_fill_manual(values=c("#EEEEEE", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Available Senses on Nearest Speed Diff") +
xlab("") +
ylab("Speed Difference (BL/s)") +
theme_light() +
facet_wrap(~ Flow, strip.position = "bottom")+
#stat_compare_means(aes(label = ..p.signif..), method = "t.test", ref.group = "Flow 0, No Ablation, Light")
#stat_compare_means(comparisons = my_comparisons, label.y = c(7.5,8.5), label = "p.signif", hide.ns = TRUE) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
Ignoring unknown parameters: outlier.shape

Trying ggpubr
my_comparisons <- list( c("No Ablation, Light", "No Ablation, Dark") )
ggplot(comp_data_near_3, aes(x = interaction(Ablation,Darkness,sep=", "), y = Distance, fill = interaction(Ablation,Darkness,sep=", ")))+
geom_boxplot(outlier.shape = NA) +
guides(fill = guide_legend(title = "Condition")) +
scale_fill_manual(values=c("#EEEEEE", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Available Senses on Nearest Neighbor Distance (NND)") +
xlab("") +
ylab("NND (BL)") +
theme_light() +
facet_wrap(~ Flow)+
#stat_compare_means(aes(label = ..p.signif..), method = "t.test", ref.group = "Flow 0, No Ablation, Light")
stat_compare_means(comparisons = my_comparisons, label.y = c(4.5), label = "p.signif", hide.ns = TRUE) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())

So we need to make all the possible GLMs for these variables and then
compare them in order to see which model does best in order to see what
actually has effects
# speed_gam_d <- gam(Speed_Diff ~ s(Distance), data = comp_data_near_3)
# speed_gam_d_f <- gam(Speed_Diff ~ s(Distance,by=Flow), data = comp_data_near_3)
# speed_gam_d_a <- gam(Speed_Diff ~ s(Distance,by=Ablation), data = comp_data_near_3)
# speed_gam_d_d <- gam(Speed_Diff ~ s(Distance,by=Darkness), data = comp_data_near_3)
# speed_gam_d_fa <- gam(Speed_Diff ~ s(Distance,by=Flow_Ablation), data = comp_data_near_3)
# speed_gam_d_fd <- gam(Speed_Diff ~ s(Distance,by=Flow_Darkness), data = comp_data_near_3)
# speed_gam_d_fda <- gam(Speed_Diff ~ s(Distance,by=Flow_Ablation_Darkness), data = comp_data_near_3)
#
# speed_gam_ca <- gam(Speed_Diff ~ s(cos_Angle), data = comp_data_near_3)
# speed_gam_ca_f <- gam(Speed_Diff ~ s(cos_Angle,by=Flow), data = comp_data_near_3)
# speed_gam_ca_a <- gam(Speed_Diff ~ s(cos_Angle,by=Ablation), data = comp_data_near_3)
# speed_gam_ca_d <- gam(Speed_Diff ~ s(cos_Angle,by=Darkness), data = comp_data_near_3)
# speed_gam_ca_fa <- gam(Speed_Diff ~ s(cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
# speed_gam_ca_fd <- gam(Speed_Diff ~ s(cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
# speed_gam_ca_fda <- gam(Speed_Diff ~ s(cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
#
# speed_gam_sa <- gam(Speed_Diff ~ s(sin_Angle), data = comp_data_near_3)
# speed_gam_sa_f <- gam(Speed_Diff ~ s(sin_Angle,by=Flow), data = comp_data_near_3)
# speed_gam_sa_a <- gam(Speed_Diff ~ s(sin_Angle,by=Ablation), data = comp_data_near_3)
# speed_gam_sa_d <- gam(Speed_Diff ~ s(sin_Angle,by=Darkness), data = comp_data_near_3)
# speed_gam_sa_fa <- gam(Speed_Diff ~ s(sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
# speed_gam_sa_fd <- gam(Speed_Diff ~ s(sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
# speed_gam_sa_fda <- gam(Speed_Diff ~ s(sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
#
# speed_gam_dca <- gam(Speed_Diff ~ s(Distance,cos_Angle), data = comp_data_near_3)
# speed_gam_dca_f <- gam(Speed_Diff ~ s(Distance,cos_Angle,by=Flow), data = comp_data_near_3)
# speed_gam_dca_a <- gam(Speed_Diff ~ s(Distance,cos_Angle,by=Ablation), data = comp_data_near_3)
# speed_gam_dca_d <- gam(Speed_Diff ~ s(Distance,cos_Angle,by=Darkness), data = comp_data_near_3)
# speed_gam_dca_fa <- gam(Speed_Diff ~ s(Distance,cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
# speed_gam_dca_fd <- gam(Speed_Diff ~ s(Distance,cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
# speed_gam_dca_fda <- gam(Speed_Diff ~ s(Distance,cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
#
# speed_gam_dsa <- gam(Speed_Diff ~ s(Distance,sin_Angle), data = comp_data_near_3)
# speed_gam_dsa_f <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Flow), data = comp_data_near_3)
# speed_gam_dsa_a <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Ablation), data = comp_data_near_3)
# speed_gam_dsa_d <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Darkness), data = comp_data_near_3)
# speed_gam_dsa_fa <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
# speed_gam_dsa_fd <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
# speed_gam_dsa_fda <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
#
# speed_gam_dcasa <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle), data = comp_data_near_3)
# speed_gam_dcasa_f <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle,by=Flow), data = comp_data_near_3)
# speed_gam_dcasa_a <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle,by=Ablation), data = comp_data_near_3)
# speed_gam_dcasa_d <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle,by=Darkness), data = comp_data_near_3)
# speed_gam_dcasa_fa <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
# speed_gam_dcasa_fd <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
# speed_gam_dcasa_fda <- gam(Speed_Diff ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
speed_AIC <- AIC(speed_gam_d,speed_gam_d_f,speed_gam_d_a,speed_gam_d_d,speed_gam_d_fa,speed_gam_d_fd,speed_gam_d_fda,
speed_gam_ca,speed_gam_ca_f,speed_gam_ca_a,speed_gam_ca_d,speed_gam_ca_fa,speed_gam_ca_fd,speed_gam_ca_fda,
speed_gam_sa,speed_gam_sa_f,speed_gam_sa_a,speed_gam_sa_d,speed_gam_sa_fa,speed_gam_sa_fd,speed_gam_sa_fda,
speed_gam_dca,speed_gam_dca_f,speed_gam_dca_a,speed_gam_dca_d,speed_gam_dca_fa,speed_gam_dca_fd,speed_gam_dca_fda,
speed_gam_dsa,speed_gam_dsa_f,speed_gam_dsa_a,speed_gam_dsa_d,speed_gam_dsa_fa,speed_gam_dsa_fd,speed_gam_dsa_fda,
speed_gam_dcasa,speed_gam_dcasa_f,speed_gam_dcasa_a,speed_gam_dcasa_d,speed_gam_dcasa_fa,speed_gam_dcasa_fd,speed_gam_dcasa_fda)
Error in AIC(speed_gam_d, speed_gam_d_f, speed_gam_d_a, speed_gam_d_d, :
object 'speed_gam_d' not found
How we do that for the cosine of the headings
cos_heading_gam_d <- gam(cos_Heading ~ s(Distance), data = comp_data_near_3)
cos_heading_gam_d_f <- gam(cos_Heading ~ s(Distance,by=Flow), data = comp_data_near_3)
cos_heading_gam_d_a <- gam(cos_Heading ~ s(Distance,by=Ablation), data = comp_data_near_3)
cos_heading_gam_d_d <- gam(cos_Heading ~ s(Distance,by=Darkness), data = comp_data_near_3)
cos_heading_gam_d_fa <- gam(cos_Heading ~ s(Distance,by=Flow_Ablation), data = comp_data_near_3)
cos_heading_gam_d_fd <- gam(cos_Heading ~ s(Distance,by=Flow_Darkness), data = comp_data_near_3)
cos_heading_gam_d_fda <- gam(cos_Heading ~ s(Distance,by=Flow_Ablation_Darkness), data = comp_data_near_3)
cos_heading_gam_ca <- gam(cos_Heading ~ s(cos_Angle), data = comp_data_near_3)
cos_heading_gam_ca_f <- gam(cos_Heading ~ s(cos_Angle,by=Flow), data = comp_data_near_3)
cos_heading_gam_ca_a <- gam(cos_Heading ~ s(cos_Angle,by=Ablation), data = comp_data_near_3)
cos_heading_gam_ca_d <- gam(cos_Heading ~ s(cos_Angle,by=Darkness), data = comp_data_near_3)
cos_heading_gam_ca_fa <- gam(cos_Heading ~ s(cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
cos_heading_gam_ca_fd <- gam(cos_Heading ~ s(cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
cos_heading_gam_ca_fda <- gam(cos_Heading ~ s(cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
cos_heading_gam_sa <- gam(cos_Heading ~ s(sin_Angle), data = comp_data_near_3)
cos_heading_gam_sa_f <- gam(cos_Heading ~ s(sin_Angle,by=Flow), data = comp_data_near_3)
cos_heading_gam_sa_a <- gam(cos_Heading ~ s(sin_Angle,by=Ablation), data = comp_data_near_3)
cos_heading_gam_sa_d <- gam(cos_Heading ~ s(sin_Angle,by=Darkness), data = comp_data_near_3)
cos_heading_gam_sa_fa <- gam(cos_Heading ~ s(sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
cos_heading_gam_sa_fd <- gam(cos_Heading ~ s(sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
cos_heading_gam_sa_fda <- gam(cos_Heading ~ s(sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
cos_heading_gam_dca <- gam(cos_Heading ~ s(Distance,cos_Angle), data = comp_data_near_3)
cos_heading_gam_dca_f <- gam(cos_Heading ~ s(Distance,cos_Angle,by=Flow), data = comp_data_near_3)
cos_heading_gam_dca_a <- gam(cos_Heading ~ s(Distance,cos_Angle,by=Ablation), data = comp_data_near_3)
cos_heading_gam_dca_d <- gam(cos_Heading ~ s(Distance,cos_Angle,by=Darkness), data = comp_data_near_3)
cos_heading_gam_dca_fa <- gam(cos_Heading ~ s(Distance,cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
cos_heading_gam_dca_fd <- gam(cos_Heading ~ s(Distance,cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
cos_heading_gam_dca_fda <- gam(cos_Heading ~ s(Distance,cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
cos_heading_gam_dsa <- gam(cos_Heading ~ s(Distance,sin_Angle), data = comp_data_near_3)
cos_heading_gam_dsa_f <- gam(cos_Heading ~ s(Distance,sin_Angle,by=Flow), data = comp_data_near_3)
cos_heading_gam_dsa_a <- gam(cos_Heading ~ s(Distance,sin_Angle,by=Ablation), data = comp_data_near_3)
cos_heading_gam_dsa_d <- gam(cos_Heading ~ s(Distance,sin_Angle,by=Darkness), data = comp_data_near_3)
cos_heading_gam_dsa_fa <- gam(cos_Heading ~ s(Distance,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
cos_heading_gam_dsa_fd <- gam(cos_Heading ~ s(Distance,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
cos_heading_gam_dsa_fda <- gam(cos_Heading ~ s(Distance,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
cos_heading_gam_dcasa <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle), data = comp_data_near_3)
cos_heading_gam_dcasa_f <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow), data = comp_data_near_3)
cos_heading_gam_dcasa_a <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Ablation), data = comp_data_near_3)
cos_heading_gam_dcasa_d <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Darkness), data = comp_data_near_3)
cos_heading_gam_dcasa_fa <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
cos_heading_gam_dcasa_fd <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
cos_heading_gam_dcasa_fda <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
cos_heading_AIC <- AIC(cos_heading_gam_d,cos_heading_gam_d_f,cos_heading_gam_d_a,cos_heading_gam_d_d,cos_heading_gam_d_fa,cos_heading_gam_d_fd,cos_heading_gam_d_fda,
cos_heading_gam_ca,cos_heading_gam_ca_f,cos_heading_gam_ca_a,cos_heading_gam_ca_d,cos_heading_gam_ca_fa,cos_heading_gam_ca_fd,cos_heading_gam_ca_fda,
cos_heading_gam_sa,cos_heading_gam_sa_f,cos_heading_gam_sa_a,cos_heading_gam_sa_d,cos_heading_gam_sa_fa,cos_heading_gam_sa_fd,cos_heading_gam_sa_fda,
cos_heading_gam_dca,cos_heading_gam_dca_f,cos_heading_gam_dca_a,cos_heading_gam_dca_d,cos_heading_gam_dca_fa,cos_heading_gam_dca_fd,cos_heading_gam_dca_fda,
cos_heading_gam_dsa,cos_heading_gam_dsa_f,cos_heading_gam_dsa_a,cos_heading_gam_dsa_d,cos_heading_gam_dsa_fa,cos_heading_gam_dsa_fd,cos_heading_gam_dsa_fda,
cos_heading_gam_dcasa,cos_heading_gam_dcasa_f,cos_heading_gam_dcasa_a,cos_heading_gam_dcasa_d,cos_heading_gam_dcasa_fa,cos_heading_gam_dcasa_fd,cos_heading_gam_dcasa_fda)
cos_heading_AIC <- tibble::rownames_to_column(cos_heading_AIC, "Model_Name")
cos_heading_AIC <- cos_heading_AIC %>% mutate(Model_Name = fct_reorder(Model_Name, -AIC)) %>% arrange(AIC)
ggplot(cos_heading_AIC %>% arrange(AIC), aes(x = Model_Name, y = AIC)) +
geom_point(color = "blue") +
xlab("") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
theme_light() +
scale_y_reverse() +
coord_flip()

cos_heading_AIC
Now with the sin of the Headings
sin_heading_gam_d <- gam(sin_Heading ~ s(Distance), data = comp_data_near_3)
sin_heading_gam_d_f <- gam(sin_Heading ~ s(Distance,by=Flow), data = comp_data_near_3)
sin_heading_gam_d_a <- gam(sin_Heading ~ s(Distance,by=Ablation), data = comp_data_near_3)
sin_heading_gam_d_d <- gam(sin_Heading ~ s(Distance,by=Darkness), data = comp_data_near_3)
sin_heading_gam_d_fa <- gam(sin_Heading ~ s(Distance,by=Flow_Ablation), data = comp_data_near_3)
sin_heading_gam_d_fd <- gam(sin_Heading ~ s(Distance,by=Flow_Darkness), data = comp_data_near_3)
sin_heading_gam_d_fda <- gam(sin_Heading ~ s(Distance,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sin_heading_gam_ca <- gam(sin_Heading ~ s(cos_Angle), data = comp_data_near_3)
sin_heading_gam_ca_f <- gam(sin_Heading ~ s(cos_Angle,by=Flow), data = comp_data_near_3)
sin_heading_gam_ca_a <- gam(sin_Heading ~ s(cos_Angle,by=Ablation), data = comp_data_near_3)
sin_heading_gam_ca_d <- gam(sin_Heading ~ s(cos_Angle,by=Darkness), data = comp_data_near_3)
sin_heading_gam_ca_fa <- gam(sin_Heading ~ s(cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
sin_heading_gam_ca_fd <- gam(sin_Heading ~ s(cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
sin_heading_gam_ca_fda <- gam(sin_Heading ~ s(cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sin_heading_gam_sa <- gam(sin_Heading ~ s(sin_Angle), data = comp_data_near_3)
sin_heading_gam_sa_f <- gam(sin_Heading ~ s(sin_Angle,by=Flow), data = comp_data_near_3)
sin_heading_gam_sa_a <- gam(sin_Heading ~ s(sin_Angle,by=Ablation), data = comp_data_near_3)
sin_heading_gam_sa_d <- gam(sin_Heading ~ s(sin_Angle,by=Darkness), data = comp_data_near_3)
sin_heading_gam_sa_fa <- gam(sin_Heading ~ s(sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
sin_heading_gam_sa_fd <- gam(sin_Heading ~ s(sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
sin_heading_gam_sa_fda <- gam(sin_Heading ~ s(sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sin_heading_gam_dca <- gam(sin_Heading ~ s(Distance,cos_Angle), data = comp_data_near_3)
sin_heading_gam_dca_f <- gam(sin_Heading ~ s(Distance,cos_Angle,by=Flow), data = comp_data_near_3)
sin_heading_gam_dca_a <- gam(sin_Heading ~ s(Distance,cos_Angle,by=Ablation), data = comp_data_near_3)
sin_heading_gam_dca_d <- gam(sin_Heading ~ s(Distance,cos_Angle,by=Darkness), data = comp_data_near_3)
sin_heading_gam_dca_fa <- gam(sin_Heading ~ s(Distance,cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
sin_heading_gam_dca_fd <- gam(sin_Heading ~ s(Distance,cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
sin_heading_gam_dca_fda <- gam(sin_Heading ~ s(Distance,cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sin_heading_gam_dsa <- gam(sin_Heading ~ s(Distance,sin_Angle), data = comp_data_near_3)
sin_heading_gam_dsa_f <- gam(sin_Heading ~ s(Distance,sin_Angle,by=Flow), data = comp_data_near_3)
sin_heading_gam_dsa_a <- gam(sin_Heading ~ s(Distance,sin_Angle,by=Ablation), data = comp_data_near_3)
sin_heading_gam_dsa_d <- gam(sin_Heading ~ s(Distance,sin_Angle,by=Darkness), data = comp_data_near_3)
sin_heading_gam_dsa_fa <- gam(sin_Heading ~ s(Distance,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
sin_heading_gam_dsa_fd <- gam(sin_Heading ~ s(Distance,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
sin_heading_gam_dsa_fda <- gam(sin_Heading ~ s(Distance,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sin_heading_gam_dcasa <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle), data = comp_data_near_3)
sin_heading_gam_dcasa_f <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow), data = comp_data_near_3)
sin_heading_gam_dcasa_a <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Ablation), data = comp_data_near_3)
sin_heading_gam_dcasa_d <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Darkness), data = comp_data_near_3)
sin_heading_gam_dcasa_fa <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
sin_heading_gam_dcasa_fd <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
sin_heading_gam_dcasa_fda <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sin_Heading_AIC <- AIC(sin_heading_gam_d,sin_heading_gam_d_f,sin_heading_gam_d_a,sin_heading_gam_d_d,sin_heading_gam_d_fa,sin_heading_gam_d_fd,sin_heading_gam_d_fda,
sin_heading_gam_ca,sin_heading_gam_ca_f,sin_heading_gam_ca_a,sin_heading_gam_ca_d,sin_heading_gam_ca_fa,sin_heading_gam_ca_fd,sin_heading_gam_ca_fda,
sin_heading_gam_sa,sin_heading_gam_sa_f,sin_heading_gam_sa_a,sin_heading_gam_sa_d,sin_heading_gam_sa_fa,sin_heading_gam_sa_fd,sin_heading_gam_sa_fda,
sin_heading_gam_dca,sin_heading_gam_dca_f,sin_heading_gam_dca_a,sin_heading_gam_dca_d,sin_heading_gam_dca_fa,sin_heading_gam_dca_fd,sin_heading_gam_dca_fda,
sin_heading_gam_dsa,sin_heading_gam_dsa_f,sin_heading_gam_dsa_a,sin_heading_gam_dsa_d,sin_heading_gam_dsa_fa,sin_heading_gam_dsa_fd,sin_heading_gam_dsa_fda,
sin_heading_gam_dcasa,sin_heading_gam_dcasa_f,sin_heading_gam_dcasa_a,sin_heading_gam_dcasa_d,sin_heading_gam_dcasa_fa,sin_heading_gam_dcasa_fd,sin_heading_gam_dcasa_fda)
sin_Heading_AIC <- tibble::rownames_to_column(sin_Heading_AIC, "Model_Name")
sin_Heading_AIC <- sin_Heading_AIC %>% mutate(Model_Name = fct_reorder(Model_Name, -AIC)) %>% arrange(AIC)
ggplot(sin_Heading_AIC %>% arrange(AIC), aes(x = Model_Name, y = AIC)) +
geom_point(color = "blue") +
xlab("") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
theme_light()+
scale_y_reverse() +
coord_flip()

sin_Heading_AIC
And now with Sync
sync_gam_d <- gam(Sync ~ s(Distance), data = comp_data_near_3)
sync_gam_d_f <- gam(Sync ~ s(Distance,by=Flow), data = comp_data_near_3)
sync_gam_d_a <- gam(Sync ~ s(Distance,by=Ablation), data = comp_data_near_3)
sync_gam_d_d <- gam(Sync ~ s(Distance,by=Darkness), data = comp_data_near_3)
sync_gam_d_fa <- gam(Sync ~ s(Distance,by=Flow_Ablation), data = comp_data_near_3)
sync_gam_d_fd <- gam(Sync ~ s(Distance,by=Flow_Darkness), data = comp_data_near_3)
sync_gam_d_fda <- gam(Sync ~ s(Distance,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sync_gam_ca <- gam(Sync ~ s(cos_Angle), data = comp_data_near_3)
sync_gam_ca_f <- gam(Sync ~ s(cos_Angle,by=Flow), data = comp_data_near_3)
sync_gam_ca_a <- gam(Sync ~ s(cos_Angle,by=Ablation), data = comp_data_near_3)
sync_gam_ca_d <- gam(Sync ~ s(cos_Angle,by=Darkness), data = comp_data_near_3)
sync_gam_ca_fa <- gam(Sync ~ s(cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
sync_gam_ca_fd <- gam(Sync ~ s(cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
sync_gam_ca_fda <- gam(Sync ~ s(cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sync_gam_sa <- gam(Sync ~ s(sin_Angle), data = comp_data_near_3)
sync_gam_sa_f <- gam(Sync ~ s(sin_Angle,by=Flow), data = comp_data_near_3)
sync_gam_sa_a <- gam(Sync ~ s(sin_Angle,by=Ablation), data = comp_data_near_3)
sync_gam_sa_d <- gam(Sync ~ s(sin_Angle,by=Darkness), data = comp_data_near_3)
sync_gam_sa_fa <- gam(Sync ~ s(sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
sync_gam_sa_fd <- gam(Sync ~ s(sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
sync_gam_sa_fda <- gam(Sync ~ s(sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sync_gam_dca <- gam(Sync ~ s(Distance,cos_Angle), data = comp_data_near_3)
sync_gam_dca_f <- gam(Sync ~ s(Distance,cos_Angle,by=Flow), data = comp_data_near_3)
sync_gam_dca_a <- gam(Sync ~ s(Distance,cos_Angle,by=Ablation), data = comp_data_near_3)
sync_gam_dca_d <- gam(Sync ~ s(Distance,cos_Angle,by=Darkness), data = comp_data_near_3)
sync_gam_dca_fa <- gam(Sync ~ s(Distance,cos_Angle,by=Flow_Ablation), data = comp_data_near_3)
sync_gam_dca_fd <- gam(Sync ~ s(Distance,cos_Angle,by=Flow_Darkness), data = comp_data_near_3)
sync_gam_dca_fda <- gam(Sync ~ s(Distance,cos_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sync_gam_dsa <- gam(Sync ~ s(Distance,sin_Angle), data = comp_data_near_3)
sync_gam_dsa_f <- gam(Sync ~ s(Distance,sin_Angle,by=Flow), data = comp_data_near_3)
sync_gam_dsa_a <- gam(Sync ~ s(Distance,sin_Angle,by=Ablation), data = comp_data_near_3)
sync_gam_dsa_d <- gam(Sync ~ s(Distance,sin_Angle,by=Darkness), data = comp_data_near_3)
sync_gam_dsa_fa <- gam(Sync ~ s(Distance,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
sync_gam_dsa_fd <- gam(Sync ~ s(Distance,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
sync_gam_dsa_fda <- gam(Sync ~ s(Distance,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
sync_gam_dcasa <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle), data = comp_data_near_3)
sync_gam_dcasa_f <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Flow), data = comp_data_near_3)
sync_gam_dcasa_a <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Ablation), data = comp_data_near_3)
sync_gam_dcasa_d <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Darkness), data = comp_data_near_3)
sync_gam_dcasa_fa <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation), data = comp_data_near_3)
sync_gam_dcasa_fd <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Darkness), data = comp_data_near_3)
sync_gam_dcasa_fda <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
Sync_AIC <- AIC(sync_gam_d,sync_gam_d_f,sync_gam_d_a,sync_gam_d_d,sync_gam_d_fa,sync_gam_d_fd,sync_gam_d_fda,
sync_gam_ca,sync_gam_ca_f,sync_gam_ca_a,sync_gam_ca_d,sync_gam_ca_fa,sync_gam_ca_fd,sync_gam_ca_fda,
sync_gam_sa,sync_gam_sa_f,sync_gam_sa_a,sync_gam_sa_d,sync_gam_sa_fa,sync_gam_sa_fd,sync_gam_sa_fda,
sync_gam_dca,sync_gam_dca_f,sync_gam_dca_a,sync_gam_dca_d,sync_gam_dca_fa,sync_gam_dca_fd,sync_gam_dca_fda,
sync_gam_dsa,sync_gam_dsa_f,sync_gam_dsa_a,sync_gam_dsa_d,sync_gam_dsa_fa,sync_gam_dsa_fd,sync_gam_dsa_fda,
sync_gam_dcasa,sync_gam_dcasa_f,sync_gam_dcasa_a,sync_gam_dcasa_d,sync_gam_dcasa_fa,sync_gam_dcasa_fd,sync_gam_dcasa_fda)
Sync_AIC <- tibble::rownames_to_column(Sync_AIC, "Model_Name")
Sync_AIC <- Sync_AIC %>% mutate(Model_Name = fct_reorder(Model_Name, -AIC)) %>% arrange(AIC)
ggplot(Sync_AIC %>% arrange(AIC), aes(x = Model_Name, y = AIC)) +
geom_point(color = "blue") +
xlab("") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
theme_light()+
scale_y_reverse() +
coord_flip()

Sync_AIC
Now we use the best of those
speed_gam <- speed_gam_dsa_fda <- gam(Speed_Diff ~ s(Distance,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
summary(speed_gam)
Family: gaussian
Link function: identity
Formula:
Speed_Diff ~ s(Distance, sin_Angle, by = Flow_Ablation_Darkness)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.615882 0.008085 76.17 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(Distance,sin_Angle):Flow_Ablation_DarknessFlow 0, Ablated, Light 7.487 10.485 4.983 9.89e-07 ***
s(Distance,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Dark 2.618 3.172 3.075 0.02466 *
s(Distance,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Light 7.496 10.506 2.152 0.01620 *
s(Distance,sin_Angle):Flow_Ablation_DarknessFlow 2, Ablated, Light 21.323 25.538 2.239 0.00033 ***
s(Distance,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Dark 21.574 25.830 2.912 1.42e-06 ***
s(Distance,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Light 13.769 18.268 1.839 0.01537 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.048 Deviance explained = 6.37%
GCV = 0.26 Scale est. = 0.25566 n = 4511
vis.gam(speed_gam)
data length [31] is not a sub-multiple or multiple of the number of rows [30]

# speed_gam_viz <- getViz(speed_gam)
# plotRGL(sm(speed_gam_viz, 1))
cos_heading_gam <- gam(cos_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
summary(cos_heading_gam)
Family: gaussian
Link function: identity
Formula:
cos_Heading ~ s(Distance, cos_Angle, sin_Angle, by = Flow_Ablation_Darkness)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.08186 0.01208 6.775 1.41e-11 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, Ablated, Light 38.161 50.349 1.806 0.000422 ***
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Dark 18.362 24.241 1.183 0.243122
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Light 21.843 29.136 2.469 2.12e-05 ***
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, Ablated, Light 16.910 22.350 1.188 0.240902
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Dark 8.546 9.066 1.534 0.128462
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Light 15.001 19.454 1.419 0.101282
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Rank: 649/655
R-sq.(adj) = 0.0466 Deviance explained = 7.17%
GCV = 0.56674 Scale est. = 0.55169 n = 4511
vis.gam(cos_heading_gam)
data length [31] is not a sub-multiple or multiple of the number of rows [30]

# cos_heading_gam_viz <- getViz(cos_heading_gam)
# plotRGL(sm(cos_heading_gam_viz, 1), fix = c("Distance" = 0))
sin_heading_gam <- gam(sin_Heading ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
summary(sin_heading_gam)
Family: gaussian
Link function: identity
Formula:
sin_Heading ~ s(Distance, cos_Angle, sin_Angle, by = Flow_Ablation_Darkness)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.00113 0.01019 -0.111 0.912
Approximate significance of smooth terms:
edf Ref.df F p-value
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, Ablated, Light 10.51 12.60 2.860 0.000499 ***
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Dark 14.00 18.02 1.546 0.066136 .
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Light 8.00 8.00 2.767 0.004736 **
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, Ablated, Light 15.70 20.64 1.548 0.054157 .
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Dark 16.94 22.29 1.079 0.367428
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Light 8.00 8.00 1.631 0.110529
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Rank: 646/655
R-sq.(adj) = 0.0247 Deviance explained = 4.05%
GCV = 0.41083 Scale est. = 0.40408 n = 4511
vis.gam(sin_heading_gam)
data length [31] is not a sub-multiple or multiple of the number of rows [30]

# sin_heading_gam_viz <- getViz(sin_heading_gam)
# plotRGL(sm(sin_heading_gam_viz, 1), fix = c("Distance" = 0))
sync_gam <- gam(Sync ~ s(Distance,cos_Angle,sin_Angle,by=Flow_Ablation_Darkness), data = comp_data_near_3)
summary(sync_gam)
Family: gaussian
Link function: identity
Formula:
Sync ~ s(Distance, cos_Angle, sin_Angle, by = Flow_Ablation_Darkness)
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.541844 0.003992 135.7 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, Ablated, Light 49.42 63.98 1.823 7.94e-05 ***
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Dark 15.35 19.99 1.689 0.02782 *
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 0, No Ablation, Light 43.25 56.84 1.008 0.45888
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, Ablated, Light 18.36 24.37 1.176 0.23445
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Dark 20.13 26.71 1.700 0.01386 *
s(Distance,cos_Angle,sin_Angle):Flow_Ablation_DarknessFlow 2, No Ablation, Light 18.25 24.02 1.832 0.00788 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Rank: 649/655
R-sq.(adj) = 0.0577 Deviance explained = 9.22%
GCV = 0.060991 Scale est. = 0.05875 n = 4511
vis.gam(sync_gam)
data length [31] is not a sub-multiple or multiple of the number of rows [30]

# sync_gam_viz <- getViz(sync_gam)
# plotRGL(sm(sync_gam_viz, 1), fix = c("Distance" = 0))
Now we make some predictions for this.
d <- seq(from = 0, to = 3, by = 0.1)
a <- seq(from = 0, to = 180, by = 5)
flows <- c("Flow 0", "Flow 2")
ablation <- c("No Ablation", "Ablated")
dark <- c("Light","Dark")
predict_df <- expand.grid(Distance = d, Angle = a, Flow = flows, Ablation = ablation, Darkness = dark)
predict_df <- predict_df %>% mutate(Flow_Ablation_Darkness = factor(paste(Flow,Ablation,Darkness,sep=", "))) %>%
filter(!(Ablation == "Ablated" & Darkness == 'Dark')) %>%
mutate(rad_Angle = deg2rad(Angle)) %>%
mutate(sin_Angle = sin(rad_Angle), cos_Angle = cos(rad_Angle))
predict_df <- predict_df %>% mutate(pred_speed_diff = predict.gam(speed_gam,predict_df),
pred_cos_heading_diff = predict.gam(cos_heading_gam,predict_df),
pred_sin_heading_diff = predict.gam(sin_heading_gam,predict_df),
pred_sync = predict.gam(sync_gam,predict_df)) %>%
mutate(Angle = rad2deg(atan2(sin_Angle,cos_Angle))) %>%
mutate(pred_heading_diff = rad2deg(atan2(pred_sin_heading_diff,pred_cos_heading_diff)))
predict_df_sum <- predict_df %>% group_by(Distance,Flow,Ablation,Darkness) %>%
mutate(mean_Speed_Distance = mean(pred_speed_diff), sd_Speed_Distance = sd(pred_speed_diff),
mean_Heading_Distance = mean(pred_heading_diff), sd_Heading_Distance = sd(pred_heading_diff),
mean_Sync_Distance = mean(pred_sync), sd_Sync_Distance = sd(pred_sync)) %>%
ungroup() %>%
group_by(Angle,Flow,Ablation,Darkness) %>%
mutate(mean_Speed_Angle = mean(pred_speed_diff), sd_Speed_Angle = sd(pred_speed_diff),
mean_Heading_Angle = rad2deg(atan(mean(pred_sin_heading_diff)/mean(pred_cos_heading_diff))),
sd_Heading_Angle = rad2deg(atan(sd(pred_sin_heading_diff)/sd(pred_cos_heading_diff))),
mean_Sync_Angle = mean(pred_sync), sd_Sync_Angle = sd(pred_sync)) %>%
ungroup()
predict_df_sum <- predict_df %>% group_by(Distance,Flow,Ablation,Darkness) %>%
mutate(mean_Speed_Distance = mean(pred_speed_diff), sd_Speed_Distance = sd(pred_speed_diff),
mean_Heading_Distance = mean(pred_heading_diff), sd_Heading_Distance = sd(pred_heading_diff),
mean_Sync_Distance = mean(pred_sync), sd_Sync_Distance = sd(pred_sync)) %>%
ungroup() %>%
group_by(Angle,Flow,Ablation,Darkness) %>%
mutate(mean_Speed_Angle = mean(pred_speed_diff), sd_Speed_Angle = sd(pred_speed_diff),
mean_Heading_Angle = rad2deg(atan(mean(pred_sin_heading_diff)/mean(pred_cos_heading_diff))),
sd_Heading_Angle = rad2deg(atan(sd(pred_sin_heading_diff)/sd(pred_cos_heading_diff))),
mean_Sync_Angle = mean(pred_sync), sd_Sync_Angle = sd(pred_sync)) %>%
ungroup()
And now we graph those?
ggplot(predict_df_sum, aes(x = Distance, y = mean_Speed_Distance, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=" "))) +
geom_line() +
#geom_point(data=predict_df, aes(x = Distance, y = pred_speed_diff, alpha = 0.15)) +
geom_ribbon(aes(ymin = mean_Speed_Distance-sd_Speed_Distance, ymax = mean_Speed_Distance+sd_Speed_Distance),
linetype = 0,
alpha = 0.1) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Distance and Senses on Speed Difference") +
xlab("Distance (BL)") +
ylab("Speed Difference (BL/s)") +
#ylim(0,1.5) +
theme_light()

ggplot(predict_df_sum, aes(x = Distance, y = mean_Heading_Distance, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
#geom_point(data=predict_df, aes(x = Distance, y = pred_heading_diff, alpha = 0.15)) +
geom_ribbon(aes(ymin = mean_Heading_Distance-sd_Heading_Distance, ymax = mean_Heading_Distance+sd_Heading_Distance),
linetype = 0,
alpha = 0.1) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Distance and Senses on Heading Difference") +
xlab("Distance (BL)") +
ylab("Heading Difference (Degrees)") +
#ylim(0,50) +
theme_light()

ggplot(predict_df_sum, aes(x = Distance, y = mean_Sync_Distance, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
#geom_point(data=predict_df, aes(x = Distance, y = pred_sync, alpha = 0.15)) +
geom_ribbon(aes(ymin = mean_Sync_Distance-sd_Sync_Distance, ymax = mean_Sync_Distance+sd_Sync_Distance),
linetype = 0,
alpha = 0.1) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Distance and Senses on Synchonization") +
xlab("Distance (BL)") +
ylab("Synchonization") +
#ylim(0,1)+
theme_light()

ggplot(predict_df_sum, aes(x = Angle, y = mean_Speed_Angle, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
#geom_point(data=predict_df, aes(x = Angle, y = pred_speed_diff, alpha = 0.15)) +
geom_ribbon(aes(ymin = mean_Speed_Angle-sd_Speed_Angle, ymax = mean_Speed_Angle+sd_Speed_Angle),
linetype = 0,
alpha = 0.1) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Bearing and Senses on Speed Difference") +
xlab("Bearing (Degrees)") +
ylab("Speed Difference (BL/s)") +
theme_light()

ggplot(predict_df_sum, aes(x = Angle, y = mean_Heading_Angle, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
#geom_point(data=predict_df, aes(x = Angle, y = pred_heading_diff, alpha = 0.15)) +
geom_ribbon(aes(ymin = mean_Heading_Angle-sd_Heading_Angle, ymax = mean_Heading_Angle+sd_Heading_Angle),
linetype = 0,
alpha = 0.1) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Bearing and Senses on Heading Difference") +
xlab("Angle (Degrees)") +
ylab("Heading Difference (Degrees)") +
theme_light()

ggplot(predict_df_sum, aes(x = Angle, y = mean_Sync_Angle, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
#geom_point(data=predict_df, aes(x = Angle, y = pred_sync, alpha = 0.15)) +
geom_ribbon(aes(ymin = mean_Sync_Angle-sd_Sync_Angle, ymax = mean_Sync_Angle+sd_Sync_Angle),
linetype = 0,
alpha = 0.1) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Bearing and Senses on Synchonization") +
xlab("Bearing (Degrees)") +
ylab("Synchonization") +
theme_light()

Density vs Things
dist_bin_size <- 1
angle_bin_size <- 30
comp_data_freqs <- comp_data_near_3 %>% mutate(Dist_bin = round_any(Distance, dist_bin_size),
Angle_bin = round_any(Angle, angle_bin_size)) %>%
group_by(Flow,Darkness,Ablation, Dist_bin, Angle_bin,Flow_Ablation_Darkness) %>%
mutate(Count = n()) %>%
ungroup() %>%
group_by(Flow,Darkness,Ablation,Flow_Ablation_Darkness) %>%
mutate(Freq = Count/n()) %>%
ungroup() %>%
group_by(Flow,Darkness,Ablation,Dist_bin,Angle_bin,Flow_Ablation_Darkness) %>%
summarise(Speed_Diff = mean(Speed_Diff),
Fold_Heading_Diff = ang_mean(fold_heading_diff),
Sync = mean(Sync),
Freq = mean(Freq))
freq_speed_glm <- glm(Speed_Diff ~ Freq*(Flow+Darkness+Ablation+Flow:Ablation+Flow:Darkness), data = comp_data_freqs)
summary(freq_speed_glm)
freq_heading_glm <- glm(Fold_Heading_Diff ~ Freq*(Flow+Darkness+Ablation+Flow:Ablation+Flow:Darkness), data = comp_data_freqs)
summary(freq_heading_glm)
freq_sync_glm <- glm(Sync ~ Freq*(Flow+Darkness+Ablation+Flow:Ablation+Flow:Darkness), data = comp_data_freqs)
summary(freq_sync_glm)
freq_speed_gam <- gam(Speed_Diff ~ s(Freq,by=Flow_Ablation_Darkness),
data = comp_data_freqs)
summary(freq_speed_gam)
freq_heading_gam <- gam(Fold_Heading_Diff ~ s(Freq,by=Flow_Ablation_Darkness),
data = comp_data_freqs)
summary(freq_heading_gam)
freq_sync_gam <- gam(Sync ~ s(Freq,by=Flow_Ablation_Darkness),
data = comp_data_freqs)
summary(freq_sync_gam)
Now we make some predictions for this.
f <- seq(from = 0.005, to = 0.07, by = 0.001)
flows <- c("Flow 0", "Flow 2")
ablation <- c("No Ablation", "Ablated")
dark <- c("Light","Dark")
freq_predict_df <- expand.grid(Freq = f, Flow = flows, Ablation = ablation, Darkness = dark)
freq_predict_df <- freq_predict_df %>% mutate(Flow_Ablation_Darkness = factor(paste(Flow,Ablation,Darkness,sep=", "))) %>%
filter(!(Ablation == "Ablated" & Darkness == 'Dark'))
freq_predict_df <- freq_predict_df %>% mutate(pred_speed_diff = predict.gam(freq_speed_gam,freq_predict_df),
pred_heading_diff = predict.gam(freq_heading_gam,freq_predict_df),
pred_sync = predict.gam(freq_sync_gam,freq_predict_df))
ggplot(comp_data_freqs, aes(x = Freq, y = Speed_Diff, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", formula = "y ~ x", se = FALSE) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Preference and Senses on Speed Difference") +
xlab("Frequency of Observations") +
ylab("Speed Difference (BL/s)") +
theme_light()
ggplot(comp_data_freqs, aes(x = Freq, y = Fold_Heading_Diff, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", formula = "y ~ x", se = FALSE) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Preference and Senses on Heading Difference") +
xlab("Frequency of Observations") +
ylab("Heading Difference (Degrees)") +
theme_light()
ggplot(comp_data_freqs, aes(x = Freq, y = Sync, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", formula = "y ~ x", se = FALSE) +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Preference and Senses on Synchonization") +
xlab("Frequency of Observations") +
ylab("Synchonization") +
theme_light()
ggplot(freq_predict_df, aes(x = Freq, y = pred_speed_diff, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Frequency of Observations on Speed Difference") +
xlab("Frequency (%)") +
ylab("Speed Difference (BL/s)") +
theme_light()
ggplot(freq_predict_df, aes(x = Freq, y = pred_heading_diff, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Frequency of Observations on Heading Difference") +
xlab("Frequency (%)") +
ylab("Heading Difference (Degrees)") +
theme_light()
ggplot(freq_predict_df, aes(x = Freq, y = pred_sync, color = interaction(Ablation,Darkness,sep=", "),
fill = interaction(Ablation,Darkness,sep=", "))) +
geom_line() +
facet_wrap(~ Flow) +
guides(fill = "none", color = guide_legend(title = "Condition")) +
scale_color_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
scale_fill_manual(values=c("#000000", "#4CB944", "#00A7E1")) +
ggtitle("Effect of Frequency of Observations on Synchonization") +
xlab("Frequency (%)") +
ylab("Synchonization") +
theme_light()
LS0tCnRpdGxlOiAiRmlzaCBDb21wYXJpc29ucyBTaW1wbGUgTW9kZWxzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjYXIpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShib290KQpsaWJyYXJ5KG1nY3YpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkobWdjVml6KQpgYGAKCkFscmlnaHQsIHNvIGZyb20gYWxsIG9mIHRoaXMgd2hhdCBkbyBJIGtub3c/CgpTcGVlZCBEaWZmZXJlbmNlczoKICBGbG93IGluY3JlYXNlcyBzcGVlZCBkaWZmZXJlbmNlcwogIEFibGF0aW9uIGRlY3JlYXNlcyBzcGVlZCBkaWZmZXJlbmNlcwogIERhcmtuZXNzIGluY3JlYXNlcyBzcGVlZCBkaWZmZXJlbmNlcwogIERpc3RhbmNlIGluY3JlYXNlcyBzcGVlZCBkaWZmZXJlbmNlcwogIEFuZ2xlcyBhcm91bmQgOTAgZGVncmVlcyBoYXZlIGEgYmlnZ2VyIGRpZmZlcmVuY2UgaW4gc3BlZWQKICAKSGVhZGluZyBEaWZmZXJlbmNlczoKICBGaXNoIGFyZSBtb3JlIGFsaWduZWQgd2hlbiB0aGV5IGFyZSBhcm91bmQgOTAgZGVncmVlcywgc2xpZ2h0bHkgbGVzcyBpbiBhYmxhdGVkIGZpc2gKICAKU3luY2hyb25pemF0aW9uOgogIERhcmtuZXNzIGluY3JlYXNlcyBzeW5jaHJvbml6YXRpb24KICAKTk5EOgogIERhcmtuZXNzIGluY3JlYXNlcyBOTkQKICBGbG93IGRlY3JlYXNlcyBOTkQKICAKTmVhcmVzdCBOZWlnaGJvciBCZWFyaW5nOgogIEluIGRhcmtuZXNzIGZpc2ggYXJlIG1vcmUgaW4gZnJvbnQgb3IgYmVoaW5kCiAgSW4gZmxvdyBmaXNoIGFyZSBtb3JlIGluIHBvc2l0aW9uZWQgYWxvbmdzaWRlIGVhY2ggb3RoZXIKClNldHMgdXAgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCBsYXRlciAKYGBge3J9CnJhZDJkZWcgPC0gZnVuY3Rpb24ocmFkKSB7KHJhZCAqIDE4MCkgLyAocGkpfQpkZWcycmFkIDwtIGZ1bmN0aW9uKGRlZykgeyhkZWcgKiBwaSkgLyAoMTgwKX0Kcm91bmRfYW55IDwtIGZ1bmN0aW9uKHgsIGFjY3VyYWN5LCBmPXJvdW5kKXtmKHgvIGFjY3VyYWN5KSAqIGFjY3VyYWN5fQphbmdfbWVhbiA8LSBmdW5jdGlvbih4KXtyYWQyZGVnKGF0YW4yKG1lYW4oc2luKGRlZzJyYWQoeCkpKSxtZWFuKGNvcyhkZWcycmFkKHgpKSkpKX0KCmZvbGRfYW5nbGVfMF8zNjBfdG9fMF8xODAgPC0gZnVuY3Rpb24oeCl7YWJzKGFicyh4LTE4MCktMTgwKX0KCmZvbGRfYW5nbGVfbmVnXzE4MF8xODBfdG9fbmVnXzkwXzkwIDwtIGZ1bmN0aW9uKHgpe2lmZWxzZSh4ID4gOTAsOTAtYWJzKDkwLXgpLGlmZWxzZSh4IDwgLTkwLCAtOTArYWJzKC05MC14KSwgeCkpfQoKbWluX24gPC0gZnVuY3Rpb24oeCxuKXtzb3J0KHgpWzE6bl19Cm1heF9uIDwtIGZ1bmN0aW9uKHgsbil7c29ydCh4LGRlY3JlYXNpbmcgPSBUUlVFKVsxOm5dfQpgYGAKClJlYWRzIGluIHRoZSBkYXRhIGFuZCBhbHRlcnMgaXQgYXMgbmVlZGVkIApgYGB7cn0KY29tcF9kYXRhIDwtIHJlYWQuY3N2KCJGaXNoX0NvbXBfVmFsdWVzLmNzdiIpCmNvbXBfZGF0YSA8LSBuYS5vbWl0KGNvbXBfZGF0YSkKCmNvbXBfZGF0YSA8LSBjb21wX2RhdGEgJT4lIG11dGF0ZShGbG93ID0gaWZlbHNlKEZsb3cgPT0gIjAiLCAiU3RpbGwgV2F0ZXIiLCAiRmxvd2luZyBXYXRlciAoMiBCTC9zKSIpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKEFibGF0aW9uID0gaWZlbHNlKEFibGF0aW9uID09ICJOIiwgIk5vIEFibGF0aW9uIiwgIkFibGF0ZWQiKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShEYXJrbmVzcyA9IGlmZWxzZShEYXJrbmVzcyA9PSAiTiIsICJMaWdodCIsICJEYXJrIikpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoRGlzdGFuY2UgPD0gNCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhYnMoU3BlZWRfRGlmZikgPD0gNikgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAjbXV0YXRlKFNwZWVkX0RpZmYgPSBhYnMoU3BlZWRfRGlmZikpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocmFkX0hlYWRpbmcgPSBkZWcycmFkKEhlYWRpbmdfRGlmZikpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc2luX0hlYWRpbmcgPSBzaW4ocmFkX0hlYWRpbmcpLCBjb3NfSGVhZGluZyA9IGNvcyhyYWRfSGVhZGluZykpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAjbXV0YXRlKGZvbGRfaGVhZGluZ19kaWZmID0gYWJzKGZvbGRfYW5nbGVfbmVnXzE4MF8xODBfdG9fbmVnXzkwXzkwKEhlYWRpbmdfRGlmZikpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKElzX0FsaWduZWQgPSBpZmVsc2UoSGVhZGluZ19EaWZmIDwgMzAsIDEsIDApKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKElzX1JldmVyc2VkID0gaWZlbHNlKEhlYWRpbmdfRGlmZiA+IDE1MCwgMSwgMCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZShGaXNoLCBjKCJGaXNoMSIsICJGaXNoMiIpLHNlcD0ieCIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoRmxvdyA9IGZhY3RvcihGbG93KSwgQWJsYXRpb24gPSBmYWN0b3IoQWJsYXRpb24pLCBEYXJrbmVzcyA9IGZhY3RvcihEYXJrbmVzcykpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoRmxvdyA9IGZjdF9yZWxldmVsKEZsb3csIGMoIlN0aWxsIFdhdGVyIiwiRmxvd2luZyBXYXRlciAoMiBCTC9zKSIpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShBYmxhdGlvbiA9IGZjdF9yZWxldmVsKEFibGF0aW9uLCBjKCJObyBBYmxhdGlvbiIsIkFibGF0ZWQiKSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoRGFya25lc3MgPSBmY3RfcmVsZXZlbChEYXJrbmVzcywgYygiTGlnaHQiLCJEYXJrIikpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHJhZF9BbmdsZSA9IGRlZzJyYWQoQW5nbGUpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHNpbl9BbmdsZSA9IHNpbihyYWRfQW5nbGUpLCBjb3NfQW5nbGUgPSBjb3MocmFkX0FuZ2xlKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShGbG93X0FibGF0aW9uID0gZmFjdG9yKHBhc3RlKEZsb3csQWJsYXRpb24sc2VwPSIsICIpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShGbG93X0RhcmtuZXNzID0gZmFjdG9yKHBhc3RlKEZsb3csRGFya25lc3Msc2VwPSIsICIpKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShGbG93X0FibGF0aW9uX0RhcmtuZXNzID0gZmFjdG9yKHBhc3RlKEZsb3csQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICNtdXRhdGUoQW5nbGUgPSBmb2xkX2FuZ2xlXzBfMzYwX3RvXzBfMTgwKEFuZ2xlKSkKCnN1bV9jb21wX2RhdGEgPC0gY29tcF9kYXRhICU+JSBtdXRhdGUoWF9EaXN0YW5jZSA9IHJvdW5kX2FueShYX0Rpc3RhbmNlLDAuMjUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX0Rpc3RhbmNlID0gcm91bmRfYW55KGFicyhZX0Rpc3RhbmNlKSwwLjI1KSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShGbG93LEFibGF0aW9uLERhcmtuZXNzLFhfRGlzdGFuY2UsWV9EaXN0YW5jZSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UoU3BlZWRfRGlmZiA9IG1lYW4oU3BlZWRfRGlmZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGluZ19EaWZmID0gYW5nX21lYW4oSGVhZGluZ19EaWZmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jID0gbWVhbihTeW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjRm9sZF9IZWFkaW5nX0RpZmYgPSBtZWFuKGZvbGRfaGVhZGluZ19kaWZmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc19BbGlnbmVkID0gbWVhbihJc19BbGlnbmVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc19SZXZlcnNlZCA9IG1lYW4oSXNfUmV2ZXJzZWQpKQoKY29tcF9kYXRhX3N3aXRjaF9maXNoIDwtIGNvbXBfZGF0YSAlPiUgbXV0YXRlKEZpc2gzID0gRmlzaDEpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoRmlzaDEgPSBGaXNoMikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShGaXNoMiA9IEZpc2gzKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KC1jKEZpc2gzKSkKCmNvbXBfZGF0YV9OTkQgPC0gYmluZF9yb3dzKGNvbXBfZGF0YSwgY29tcF9kYXRhX3N3aXRjaF9maXNoKSAlPiUgZ3JvdXBfYnkoWWVhcixNb250aCxEYXksVHJpYWwsRmlzaDEsVGFpbGJlYXRfTnVtKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoRGlzdGFuY2UgPT0gbWluKERpc3RhbmNlKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpCgpjb21wX2RhdGFfbmVhcl8zIDwtIGJpbmRfcm93cyhjb21wX2RhdGEsIGNvbXBfZGF0YV9zd2l0Y2hfZmlzaCkgJT4lIGdyb3VwX2J5KFllYXIsTW9udGgsRGF5LFRyaWFsLEZpc2gxLFRhaWxiZWF0X051bSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfbWluKERpc3RhbmNlLCBuID0gMykgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0KERpc3RhbmNlLCAua2VlcF9hbGw9IFRSVUUpCmBgYAoKI0Jhc2ljIFN0YXRzCgpgYGB7cn0Kc3BlZWRfYW5vdmEgPC0gYW92KFNwZWVkX0RpZmYgfiBGbG93ICsgQWJsYXRpb24gKyBEYXJrbmVzcyArIEZsb3c6QWJsYXRpb24gKyBGbG93OkRhcmtuZXNzLCBkYXRhID0gY29tcF9kYXRhX05ORCkKCkFub3ZhKHNwZWVkX2Fub3ZhKQoKaGVhZGluZ19hbm92YSA8LSBhb3YoSGVhZGluZ19EaWZmIH4gRmxvdyArIEFibGF0aW9uICsgRGFya25lc3MgKyBGbG93OkFibGF0aW9uICsgRmxvdzpEYXJrbmVzcywgZGF0YSA9IGNvbXBfZGF0YV9OTkQpCgpBbm92YShoZWFkaW5nX2Fub3ZhKQoKc3luY19hbm92YSA8LSBhb3YoU3luYyB+IEZsb3cgKyBBYmxhdGlvbiArIERhcmtuZXNzICsgRmxvdzpBYmxhdGlvbiArIEZsb3c6RGFya25lc3MsIGRhdGEgPSBjb21wX2RhdGFfTk5EKQoKQW5vdmEoc3luY19hbm92YSkKCmRpc3RfYW5vdmEgPC0gYW92KERpc3RhbmNlIH4gRmxvdyArIEFibGF0aW9uICsgRGFya25lc3MgKyBGbG93OkFibGF0aW9uICsgRmxvdzpEYXJrbmVzcywgZGF0YSA9IGNvbXBfZGF0YV9OTkQpCgpBbm92YShkaXN0X2Fub3ZhKQoKYW5nbGVfYW5vdmEgPC0gYW92KEFuZ2xlIH4gRmxvdyArIEFibGF0aW9uICsgRGFya25lc3MgKyBGbG93OkFibGF0aW9uICsgRmxvdzpEYXJrbmVzcywgZGF0YSA9IGNvbXBfZGF0YV9OTkQpCgpBbm92YShhbmdsZV9hbm92YSkKYGBgCgoKYGBge3J9CmdncGxvdChjb21wX2RhdGFfbmVhcl8zLCBhZXMoeCA9IEZsb3csIHkgPSBTcGVlZF9EaWZmLCBmaWxsID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkrCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkNvbmRpdGlvbiIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNFRUVFRUUiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBnZ3RpdGxlKCJFZmZlY3Qgb2YgQXZhaWxhYmxlIFNlbnNlcyBvbiBTcGVlZCBEaWZmZXJlbmNlIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJTcGVlZCBEaWZmZXJlbmNlIChCTC9zKSIpICsKICAjeWxpbSgtMC4xLDIuNSkgKwogIHRoZW1lX2xpZ2h0KCkKCiNyYWQyZGVnKGF0YW4oc2luX0hlYWRpbmcvY29zX0hlYWRpbmcpKQoKZ2dwbG90KGNvbXBfZGF0YV9uZWFyXzMsIGFlcyh4ID0gRmxvdywgeSA9IEhlYWRpbmdfRGlmZiwgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpKwogIGdlb21fdmlvbGluKG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkNvbmRpdGlvbiIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNFRUVFRUUiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBnZ3RpdGxlKCJFZmZlY3Qgb2YgQXZhaWxhYmxlIFNlbnNlcyBvbiBIZWFkaW5nIERpZmZlcmVuY2UiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIkhlYWRpbmcgRGlmZmVyZW5jZSAoRGVncmVlcykiKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC05MCwtNjAsLTMwLDAsMzAsNjAsOTApKSArCiAgdGhlbWVfbGlnaHQoKQoKZ2dwbG90KGNvbXBfZGF0YV9uZWFyXzMsIGFlcyh4ID0gRmxvdywgeSA9IFN5bmMsIGZpbGwgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIikpKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0VFRUVFRSIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBBdmFpbGFibGUgU2Vuc2VzIG9uIFRhaWxiZWF0IFN5bmNob25pemF0aW9uIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJTeW5jcm9uaXphdGlvbiIpICsKICB0aGVtZV9saWdodCgpCgpnZ3Bsb3QoY29tcF9kYXRhX25lYXJfMywgYWVzKHggPSBGbG93LCB5ID0gRGlzdGFuY2UsIGZpbGwgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIikpKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0VFRUVFRSIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBBdmFpbGFibGUgU2Vuc2VzIG9uIE5lYXJlc3QgTmVpZ2hib3IgRGlzdGFuY2UgKE5ORCkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIk5ORCAoQkwpIikgKwogIHRoZW1lX2xpZ2h0KCkKCiNyYWQyZGVnKGF0YW4yKHNpbl9BbmdsZSxjb3NfQW5nbGUpKQoKZ2dwbG90KGNvbXBfZGF0YV9uZWFyXzMsIGFlcyh4ID0gRmxvdywgeSA9IEFuZ2xlLCBmaWxsID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkrCiAgZ2VvbV92aW9saW4ob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0VFRUVFRSIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBBdmFpbGFibGUgU2Vuc2VzIG9uIE5lYXJlc3QgTmVpZ2hib3IgQmVhcmluZyIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiTmVhcmVzdCBOZWlnaGJvciBCZWFyaW5nIChEZWdyZWVzKSIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLTkwLC02MCwtMzAsMCwzMCw2MCw5MCkpICsKICB0aGVtZV9saWdodCgpCgpgYGAKIEp1c3QgbmVhcmVzdCBGaXNoIFNwZWVkIERpZmYKIApgYGB7cn0KY29tcF9kYXRhX25lYXJfMSA8LSBiaW5kX3Jvd3MoY29tcF9kYXRhLCBjb21wX2RhdGFfc3dpdGNoX2Zpc2gpICU+JSBncm91cF9ieShZZWFyLE1vbnRoLERheSxUcmlhbCxGaXNoMSxUYWlsYmVhdF9OdW0pICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX21heChEaXN0YW5jZSwgbiA9IDEpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdChEaXN0YW5jZSwgLmtlZXBfYWxsPSBUUlVFKQoKc3BlZWRfYW5vdmFfbm4gPC0gYW92KFNwZWVkX0RpZmYgfiBGbG93ICsgQWJsYXRpb24gKyBEYXJrbmVzcyArIEZsb3c6QWJsYXRpb24gKyBGbG93OkRhcmtuZXNzLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMSkKCkFub3ZhKHNwZWVkX2Fub3ZhX25uKQoKbXlfY29tcGFyaXNvbnMgPC0gbGlzdCggYygiTm8gQWJsYXRpb24sIExpZ2h0IiwgIk5vIEFibGF0aW9uLCBEYXJrIikpCgpnZ3Bsb3QoY29tcF9kYXRhX25lYXJfMSwgYWVzKHggPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksIHkgPSBTcGVlZF9EaWZmLCBmaWxsID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkrCiAgZ2VvbV92aW9saW4ob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0VFRUVFRSIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBBdmFpbGFibGUgU2Vuc2VzIG9uIE5lYXJlc3QgU3BlZWQgRGlmZiIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU3BlZWQgRGlmZmVyZW5jZSAoQkwvcykiKSArCiAgdGhlbWVfbGlnaHQoKSArCiAgZmFjZXRfd3JhcCh+IEZsb3csIHN0cmlwLnBvc2l0aW9uID0gImJvdHRvbSIpKwogICNzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGxhYmVsID0gLi5wLnNpZ25pZi4uKSwgbWV0aG9kID0gInQudGVzdCIsIHJlZi5ncm91cCA9ICJGbG93IDAsIE5vIEFibGF0aW9uLCBMaWdodCIpCiAgI3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbC55ID0gYyg3LjUsOC41KSwgbGFiZWwgPSAicC5zaWduaWYiLCBoaWRlLm5zID0gVFJVRSkgKwogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpCmBgYAoKClRyeWluZyBnZ3B1YnIKCmBgYHtyfQpteV9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJObyBBYmxhdGlvbiwgTGlnaHQiLCAiTm8gQWJsYXRpb24sIERhcmsiKSApCgpnZ3Bsb3QoY29tcF9kYXRhX25lYXJfMywgYWVzKHggPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksIHkgPSBEaXN0YW5jZSwgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJDb25kaXRpb24iKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRUVFRUVFIiwgIiM0Q0I5NDQiLCAiIzAwQTdFMSIpKSArCiAgZ2d0aXRsZSgiRWZmZWN0IG9mIEF2YWlsYWJsZSBTZW5zZXMgb24gTmVhcmVzdCBOZWlnaGJvciBEaXN0YW5jZSAoTk5EKSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiTk5EIChCTCkiKSArCiAgdGhlbWVfbGlnaHQoKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpKwogICNzdGF0X2NvbXBhcmVfbWVhbnMoYWVzKGxhYmVsID0gLi5wLnNpZ25pZi4uKSwgbWV0aG9kID0gInQudGVzdCIsIHJlZi5ncm91cCA9ICJGbG93IDAsIE5vIEFibGF0aW9uLCBMaWdodCIpCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIGxhYmVsLnkgPSBjKDQuNSksIGxhYmVsID0gInAuc2lnbmlmIiwgaGlkZS5ucyA9IFRSVUUpICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKQpgYGAKCgpTbyB3ZSBuZWVkIHRvIG1ha2UgYWxsIHRoZSBwb3NzaWJsZSBHTE1zIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIHRoZW4gY29tcGFyZSB0aGVtIGluIG9yZGVyIHRvIHNlZSB3aGljaCBtb2RlbCBkb2VzIGJlc3QgaW4gb3JkZXIgdG8gc2VlIHdoYXQgYWN0dWFsbHkgaGFzIGVmZmVjdHMKYGBge3J9CiMgc3BlZWRfZ2FtX2QgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2RfZiA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kX2EgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2RfZCA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZF9mYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kX2ZkIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2RfZmRhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgc3BlZWRfZ2FtX2NhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhjb3NfQW5nbGUpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fY2FfZiA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoY29zX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fY2FfYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoY29zX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2NhX2QgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKGNvc19BbmdsZSxieT1EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9jYV9mYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoY29zX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fY2FfZmQgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKGNvc19BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2NhX2ZkYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoY29zX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyAKIyBzcGVlZF9nYW1fc2EgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKHNpbl9BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9zYV9mIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhzaW5fQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9zYV9hIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhzaW5fQW5nbGUsYnk9QWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fc2FfZCA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoc2luX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX3NhX2ZhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9zYV9mZCA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoc2luX0FuZ2xlLGJ5PUZsb3dfRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fc2FfZmRhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIHNwZWVkX2dhbV9kY2EgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLGNvc19BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kY2FfZiA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZGNhX2EgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kY2FfZCA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2RjYV9mYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZGNhX2ZkIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kY2FfZmRhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIHNwZWVkX2dhbV9kc2EgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kc2FfZiA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZHNhX2EgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kc2FfZCA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2RzYV9mYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZHNhX2ZkIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kc2FfZmRhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIHNwZWVkX2dhbV9kY2FzYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kY2FzYV9mIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZGNhc2FfYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kY2FzYV9kIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3BlZWRfZ2FtX2RjYXNhX2ZhIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzcGVlZF9nYW1fZGNhc2FfZmQgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxzaW5fQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNwZWVkX2dhbV9kY2FzYV9mZGEgPC0gZ2FtKFNwZWVkX0RpZmYgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQoKc3BlZWRfQUlDIDwtIEFJQyhzcGVlZF9nYW1fZCxzcGVlZF9nYW1fZF9mLHNwZWVkX2dhbV9kX2Esc3BlZWRfZ2FtX2RfZCxzcGVlZF9nYW1fZF9mYSxzcGVlZF9nYW1fZF9mZCxzcGVlZF9nYW1fZF9mZGEsCiAgICAgICAgICAgICAgICAgc3BlZWRfZ2FtX2NhLHNwZWVkX2dhbV9jYV9mLHNwZWVkX2dhbV9jYV9hLHNwZWVkX2dhbV9jYV9kLHNwZWVkX2dhbV9jYV9mYSxzcGVlZF9nYW1fY2FfZmQsc3BlZWRfZ2FtX2NhX2ZkYSwKICAgICAgICAgICAgICAgICBzcGVlZF9nYW1fc2Esc3BlZWRfZ2FtX3NhX2Ysc3BlZWRfZ2FtX3NhX2Esc3BlZWRfZ2FtX3NhX2Qsc3BlZWRfZ2FtX3NhX2ZhLHNwZWVkX2dhbV9zYV9mZCxzcGVlZF9nYW1fc2FfZmRhLAogICAgICAgICAgICAgICAgIHNwZWVkX2dhbV9kY2Esc3BlZWRfZ2FtX2RjYV9mLHNwZWVkX2dhbV9kY2FfYSxzcGVlZF9nYW1fZGNhX2Qsc3BlZWRfZ2FtX2RjYV9mYSxzcGVlZF9nYW1fZGNhX2ZkLHNwZWVkX2dhbV9kY2FfZmRhLAogICAgICAgICAgICAgICAgIHNwZWVkX2dhbV9kc2Esc3BlZWRfZ2FtX2RzYV9mLHNwZWVkX2dhbV9kc2FfYSxzcGVlZF9nYW1fZHNhX2Qsc3BlZWRfZ2FtX2RzYV9mYSxzcGVlZF9nYW1fZHNhX2ZkLHNwZWVkX2dhbV9kc2FfZmRhLAogICAgICAgICAgICAgICAgIHNwZWVkX2dhbV9kY2FzYSxzcGVlZF9nYW1fZGNhc2FfZixzcGVlZF9nYW1fZGNhc2FfYSxzcGVlZF9nYW1fZGNhc2FfZCxzcGVlZF9nYW1fZGNhc2FfZmEsc3BlZWRfZ2FtX2RjYXNhX2ZkLHNwZWVkX2dhbV9kY2FzYV9mZGEpCgpzcGVlZF9BSUMgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oc3BlZWRfQUlDLCAiTW9kZWxfTmFtZSIpCgpzcGVlZF9BSUMgPC0gc3BlZWRfQUlDICU+JSBtdXRhdGUoTW9kZWxfTmFtZSA9IGZjdF9yZW9yZGVyKE1vZGVsX05hbWUsIC1BSUMpKSAlPiUgYXJyYW5nZShBSUMpCgpnZ3Bsb3Qoc3BlZWRfQUlDLCBhZXMoeCA9IE1vZGVsX05hbWUsIHkgPSBBSUMpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJibHVlIikgKwogIHhsYWIoIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsKICB0aGVtZV9saWdodCgpKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBjb29yZF9mbGlwKCkKCnNwZWVkX0FJQwpgYGAKCkhvdyB3ZSBkbyB0aGF0IGZvciB0aGUgY29zaW5lIG9mIHRoZSBoZWFkaW5ncwoKYGBge3J9CiMgY29zX2hlYWRpbmdfZ2FtX2QgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kX2YgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxieT1GbG93KSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RfYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKERpc3RhbmNlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RfZCA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKERpc3RhbmNlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RfZmEgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxieT1GbG93X0FibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RfZmQgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RfZmRhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIGNvc19oZWFkaW5nX2dhbV9jYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKGNvc19BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9jYV9mIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoY29zX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fY2FfYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKGNvc19BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9jYV9kIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoY29zX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2NhX2ZhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoY29zX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fY2FfZmQgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhjb3NfQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9jYV9mZGEgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIGNvc19oZWFkaW5nX2dhbV9zYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKHNpbl9BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9zYV9mIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoc2luX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fc2FfYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKHNpbl9BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9zYV9kIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoc2luX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX3NhX2ZhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fc2FfZmQgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9zYV9mZGEgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIGNvc19oZWFkaW5nX2dhbV9kY2EgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fZGNhX2YgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kY2FfYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kY2FfZCA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxieT1EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kY2FfZmEgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kY2FfZmQgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kY2FfZmRhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyAKIyBjb3NfaGVhZGluZ19nYW1fZHNhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RzYV9mIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fZHNhX2EgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9QWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fZHNhX2QgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fZHNhX2ZhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fZHNhX2ZkIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3dfRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBjb3NfaGVhZGluZ19nYW1fZHNhX2ZkYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgY29zX2hlYWRpbmdfZ2FtX2RjYXNhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIGNvc19oZWFkaW5nX2dhbV9kY2FzYV9mIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1GbG93KSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RjYXNhX2EgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RjYXNhX2QgPC0gZ2FtKGNvc19IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RjYXNhX2ZhIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RjYXNhX2ZkIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgY29zX2hlYWRpbmdfZ2FtX2RjYXNhX2ZkYSA8LSBnYW0oY29zX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQoKY29zX2hlYWRpbmdfQUlDIDwtIEFJQyhjb3NfaGVhZGluZ19nYW1fZCxjb3NfaGVhZGluZ19nYW1fZF9mLGNvc19oZWFkaW5nX2dhbV9kX2EsY29zX2hlYWRpbmdfZ2FtX2RfZCxjb3NfaGVhZGluZ19nYW1fZF9mYSxjb3NfaGVhZGluZ19nYW1fZF9mZCxjb3NfaGVhZGluZ19nYW1fZF9mZGEsCiAgICAgICAgICAgICAgICAgY29zX2hlYWRpbmdfZ2FtX2NhLGNvc19oZWFkaW5nX2dhbV9jYV9mLGNvc19oZWFkaW5nX2dhbV9jYV9hLGNvc19oZWFkaW5nX2dhbV9jYV9kLGNvc19oZWFkaW5nX2dhbV9jYV9mYSxjb3NfaGVhZGluZ19nYW1fY2FfZmQsY29zX2hlYWRpbmdfZ2FtX2NhX2ZkYSwKICAgICAgICAgICAgICAgICBjb3NfaGVhZGluZ19nYW1fc2EsY29zX2hlYWRpbmdfZ2FtX3NhX2YsY29zX2hlYWRpbmdfZ2FtX3NhX2EsY29zX2hlYWRpbmdfZ2FtX3NhX2QsY29zX2hlYWRpbmdfZ2FtX3NhX2ZhLGNvc19oZWFkaW5nX2dhbV9zYV9mZCxjb3NfaGVhZGluZ19nYW1fc2FfZmRhLAogICAgICAgICAgICAgICAgIGNvc19oZWFkaW5nX2dhbV9kY2EsY29zX2hlYWRpbmdfZ2FtX2RjYV9mLGNvc19oZWFkaW5nX2dhbV9kY2FfYSxjb3NfaGVhZGluZ19nYW1fZGNhX2QsY29zX2hlYWRpbmdfZ2FtX2RjYV9mYSxjb3NfaGVhZGluZ19nYW1fZGNhX2ZkLGNvc19oZWFkaW5nX2dhbV9kY2FfZmRhLAogICAgICAgICAgICAgICAgIGNvc19oZWFkaW5nX2dhbV9kc2EsY29zX2hlYWRpbmdfZ2FtX2RzYV9mLGNvc19oZWFkaW5nX2dhbV9kc2FfYSxjb3NfaGVhZGluZ19nYW1fZHNhX2QsY29zX2hlYWRpbmdfZ2FtX2RzYV9mYSxjb3NfaGVhZGluZ19nYW1fZHNhX2ZkLGNvc19oZWFkaW5nX2dhbV9kc2FfZmRhLAogICAgICAgICAgICAgICAgIGNvc19oZWFkaW5nX2dhbV9kY2FzYSxjb3NfaGVhZGluZ19nYW1fZGNhc2FfZixjb3NfaGVhZGluZ19nYW1fZGNhc2FfYSxjb3NfaGVhZGluZ19nYW1fZGNhc2FfZCxjb3NfaGVhZGluZ19nYW1fZGNhc2FfZmEsY29zX2hlYWRpbmdfZ2FtX2RjYXNhX2ZkLGNvc19oZWFkaW5nX2dhbV9kY2FzYV9mZGEpCgoKY29zX2hlYWRpbmdfQUlDIDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKGNvc19oZWFkaW5nX0FJQywgIk1vZGVsX05hbWUiKQoKY29zX2hlYWRpbmdfQUlDIDwtIGNvc19oZWFkaW5nX0FJQyAlPiUgbXV0YXRlKE1vZGVsX05hbWUgPSBmY3RfcmVvcmRlcihNb2RlbF9OYW1lLCAtQUlDKSkgJT4lIGFycmFuZ2UoQUlDKQoKZ2dwbG90KGNvc19oZWFkaW5nX0FJQyAlPiUgYXJyYW5nZShBSUMpLCBhZXMoeCA9IE1vZGVsX05hbWUsIHkgPSBBSUMpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJibHVlIikgKwogIHhsYWIoIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsKICB0aGVtZV9saWdodCgpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgY29vcmRfZmxpcCgpCgpjb3NfaGVhZGluZ19BSUMKYGBgCgpOb3cgd2l0aCB0aGUgc2luIG9mIHRoZSBIZWFkaW5ncwpgYGB7cn0KIyBzaW5faGVhZGluZ19nYW1fZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RfZiA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZF9hIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoRGlzdGFuY2UsYnk9QWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZF9kIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoRGlzdGFuY2UsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZF9mYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZF9mZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGJ5PUZsb3dfRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZF9mZGEgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgc2luX2hlYWRpbmdfZ2FtX2NhIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoY29zX0FuZ2xlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2NhX2YgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhjb3NfQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9jYV9hIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoY29zX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2NhX2QgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhjb3NfQW5nbGUsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fY2FfZmEgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9jYV9mZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKGNvc19BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2NhX2ZkYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKGNvc19BbmdsZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgc2luX2hlYWRpbmdfZ2FtX3NhIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoc2luX0FuZ2xlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX3NhX2YgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhzaW5fQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9zYV9hIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoc2luX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX3NhX2QgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhzaW5fQW5nbGUsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fc2FfZmEgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9zYV9mZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKHNpbl9BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX3NhX2ZkYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgc2luX2hlYWRpbmdfZ2FtX2RjYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9kY2FfZiA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxieT1GbG93KSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RjYV9hIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RjYV9kIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RjYV9mYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxieT1GbG93X0FibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RjYV9mZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RjYV9mZGEgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIHNpbl9oZWFkaW5nX2dhbV9kc2EgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZHNhX2YgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9kc2FfYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9kc2FfZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9kc2FfZmEgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9kc2FfZmQgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHNpbl9oZWFkaW5nX2dhbV9kc2FfZmRhIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyAKIyBzaW5faGVhZGluZ19nYW1fZGNhc2EgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc2luX2hlYWRpbmdfZ2FtX2RjYXNhX2YgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZGNhc2FfYSA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxzaW5fQW5nbGUsYnk9QWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZGNhc2FfZCA8LSBnYW0oc2luX0hlYWRpbmcgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxzaW5fQW5nbGUsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZGNhc2FfZmEgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZGNhc2FfZmQgPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzaW5faGVhZGluZ19nYW1fZGNhc2FfZmRhIDwtIGdhbShzaW5fSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCgpzaW5fSGVhZGluZ19BSUMgPC0gQUlDKHNpbl9oZWFkaW5nX2dhbV9kLHNpbl9oZWFkaW5nX2dhbV9kX2Ysc2luX2hlYWRpbmdfZ2FtX2RfYSxzaW5faGVhZGluZ19nYW1fZF9kLHNpbl9oZWFkaW5nX2dhbV9kX2ZhLHNpbl9oZWFkaW5nX2dhbV9kX2ZkLHNpbl9oZWFkaW5nX2dhbV9kX2ZkYSwKICAgICAgICAgICAgICAgICBzaW5faGVhZGluZ19nYW1fY2Esc2luX2hlYWRpbmdfZ2FtX2NhX2Ysc2luX2hlYWRpbmdfZ2FtX2NhX2Esc2luX2hlYWRpbmdfZ2FtX2NhX2Qsc2luX2hlYWRpbmdfZ2FtX2NhX2ZhLHNpbl9oZWFkaW5nX2dhbV9jYV9mZCxzaW5faGVhZGluZ19nYW1fY2FfZmRhLAogICAgICAgICAgICAgICAgIHNpbl9oZWFkaW5nX2dhbV9zYSxzaW5faGVhZGluZ19nYW1fc2FfZixzaW5faGVhZGluZ19nYW1fc2FfYSxzaW5faGVhZGluZ19nYW1fc2FfZCxzaW5faGVhZGluZ19nYW1fc2FfZmEsc2luX2hlYWRpbmdfZ2FtX3NhX2ZkLHNpbl9oZWFkaW5nX2dhbV9zYV9mZGEsCiAgICAgICAgICAgICAgICAgc2luX2hlYWRpbmdfZ2FtX2RjYSxzaW5faGVhZGluZ19nYW1fZGNhX2Ysc2luX2hlYWRpbmdfZ2FtX2RjYV9hLHNpbl9oZWFkaW5nX2dhbV9kY2FfZCxzaW5faGVhZGluZ19nYW1fZGNhX2ZhLHNpbl9oZWFkaW5nX2dhbV9kY2FfZmQsc2luX2hlYWRpbmdfZ2FtX2RjYV9mZGEsCiAgICAgICAgICAgICAgICAgc2luX2hlYWRpbmdfZ2FtX2RzYSxzaW5faGVhZGluZ19nYW1fZHNhX2Ysc2luX2hlYWRpbmdfZ2FtX2RzYV9hLHNpbl9oZWFkaW5nX2dhbV9kc2FfZCxzaW5faGVhZGluZ19nYW1fZHNhX2ZhLHNpbl9oZWFkaW5nX2dhbV9kc2FfZmQsc2luX2hlYWRpbmdfZ2FtX2RzYV9mZGEsCiAgICAgICAgICAgICAgICAgc2luX2hlYWRpbmdfZ2FtX2RjYXNhLHNpbl9oZWFkaW5nX2dhbV9kY2FzYV9mLHNpbl9oZWFkaW5nX2dhbV9kY2FzYV9hLHNpbl9oZWFkaW5nX2dhbV9kY2FzYV9kLHNpbl9oZWFkaW5nX2dhbV9kY2FzYV9mYSxzaW5faGVhZGluZ19nYW1fZGNhc2FfZmQsc2luX2hlYWRpbmdfZ2FtX2RjYXNhX2ZkYSkKCgpzaW5fSGVhZGluZ19BSUMgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oc2luX0hlYWRpbmdfQUlDLCAiTW9kZWxfTmFtZSIpCgpzaW5fSGVhZGluZ19BSUMgPC0gc2luX0hlYWRpbmdfQUlDICU+JSBtdXRhdGUoTW9kZWxfTmFtZSA9IGZjdF9yZW9yZGVyKE1vZGVsX05hbWUsIC1BSUMpKSAlPiUgYXJyYW5nZShBSUMpCgpnZ3Bsb3Qoc2luX0hlYWRpbmdfQUlDICU+JSBhcnJhbmdlKEFJQyksIGFlcyh4ID0gTW9kZWxfTmFtZSwgeSA9IEFJQykpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArCiAgeGxhYigiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkgKwogIHRoZW1lX2xpZ2h0KCkrCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIGNvb3JkX2ZsaXAoKQoKc2luX0hlYWRpbmdfQUlDCmBgYAoKQW5kIG5vdyB3aXRoIFN5bmMKCmBgYHtyfQojIHN5bmNfZ2FtX2QgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZF9mIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxieT1GbG93KSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZF9hIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RfZCA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2UsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kX2ZhIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxieT1GbG93X0FibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZF9mZCA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2UsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RfZmRhIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgc3luY19nYW1fY2EgPC0gZ2FtKFN5bmMgfiBzKGNvc19BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2NhX2YgPC0gZ2FtKFN5bmMgfiBzKGNvc19BbmdsZSxieT1GbG93KSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fY2FfYSA8LSBnYW0oU3luYyB+IHMoY29zX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fY2FfZCA8LSBnYW0oU3luYyB+IHMoY29zX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fY2FfZmEgPC0gZ2FtKFN5bmMgfiBzKGNvc19BbmdsZSxieT1GbG93X0FibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fY2FfZmQgPC0gZ2FtKFN5bmMgfiBzKGNvc19BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fY2FfZmRhIDwtIGdhbShTeW5jIH4gcyhjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIHN5bmNfZ2FtX3NhIDwtIGdhbShTeW5jIH4gcyhzaW5fQW5nbGUpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9zYV9mIDwtIGdhbShTeW5jIH4gcyhzaW5fQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX3NhX2EgPC0gZ2FtKFN5bmMgfiBzKHNpbl9BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX3NhX2QgPC0gZ2FtKFN5bmMgfiBzKHNpbl9BbmdsZSxieT1EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX3NhX2ZhIDwtIGdhbShTeW5jIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX3NhX2ZkIDwtIGdhbShTeW5jIH4gcyhzaW5fQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX3NhX2ZkYSA8LSBnYW0oU3luYyB+IHMoc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyAKIyBzeW5jX2dhbV9kY2EgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlLGNvc19BbmdsZSksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RjYV9mIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9RmxvdyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RjYV9hIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9QWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kY2FfZCA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PURhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZGNhX2ZhIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RjYV9mZCA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLGJ5PUZsb3dfRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kY2FfZmRhIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsYnk9Rmxvd19BYmxhdGlvbl9EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIAojIHN5bmNfZ2FtX2RzYSA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZHNhX2YgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1GbG93KSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZHNhX2EgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1BYmxhdGlvbiksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RzYV9kIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kc2FfZmEgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZHNhX2ZkIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxzaW5fQW5nbGUsYnk9Rmxvd19EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RzYV9mZGEgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlLHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgCiMgc3luY19nYW1fZGNhc2EgPC0gZ2FtKFN5bmMgfiBzKERpc3RhbmNlLGNvc19BbmdsZSxzaW5fQW5nbGUpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kY2FzYV9mIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3cpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kY2FzYV9hIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUFibGF0aW9uKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZGNhc2FfZCA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1EYXJrbmVzcyksIGRhdGEgPSBjb21wX2RhdGFfbmVhcl8zKQojIHN5bmNfZ2FtX2RjYXNhX2ZhIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb24pLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKIyBzeW5jX2dhbV9kY2FzYV9mZCA8LSBnYW0oU3luYyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1GbG93X0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCiMgc3luY19nYW1fZGNhc2FfZmRhIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKClN5bmNfQUlDIDwtIEFJQyhzeW5jX2dhbV9kLHN5bmNfZ2FtX2RfZixzeW5jX2dhbV9kX2Esc3luY19nYW1fZF9kLHN5bmNfZ2FtX2RfZmEsc3luY19nYW1fZF9mZCxzeW5jX2dhbV9kX2ZkYSwKICAgICAgICAgICAgICAgICBzeW5jX2dhbV9jYSxzeW5jX2dhbV9jYV9mLHN5bmNfZ2FtX2NhX2Esc3luY19nYW1fY2FfZCxzeW5jX2dhbV9jYV9mYSxzeW5jX2dhbV9jYV9mZCxzeW5jX2dhbV9jYV9mZGEsCiAgICAgICAgICAgICAgICAgc3luY19nYW1fc2Esc3luY19nYW1fc2FfZixzeW5jX2dhbV9zYV9hLHN5bmNfZ2FtX3NhX2Qsc3luY19nYW1fc2FfZmEsc3luY19nYW1fc2FfZmQsc3luY19nYW1fc2FfZmRhLAogICAgICAgICAgICAgICAgIHN5bmNfZ2FtX2RjYSxzeW5jX2dhbV9kY2FfZixzeW5jX2dhbV9kY2FfYSxzeW5jX2dhbV9kY2FfZCxzeW5jX2dhbV9kY2FfZmEsc3luY19nYW1fZGNhX2ZkLHN5bmNfZ2FtX2RjYV9mZGEsCiAgICAgICAgICAgICAgICAgc3luY19nYW1fZHNhLHN5bmNfZ2FtX2RzYV9mLHN5bmNfZ2FtX2RzYV9hLHN5bmNfZ2FtX2RzYV9kLHN5bmNfZ2FtX2RzYV9mYSxzeW5jX2dhbV9kc2FfZmQsc3luY19nYW1fZHNhX2ZkYSwKICAgICAgICAgICAgICAgICBzeW5jX2dhbV9kY2FzYSxzeW5jX2dhbV9kY2FzYV9mLHN5bmNfZ2FtX2RjYXNhX2Esc3luY19nYW1fZGNhc2FfZCxzeW5jX2dhbV9kY2FzYV9mYSxzeW5jX2dhbV9kY2FzYV9mZCxzeW5jX2dhbV9kY2FzYV9mZGEpCgoKU3luY19BSUMgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oU3luY19BSUMsICJNb2RlbF9OYW1lIikKClN5bmNfQUlDIDwtIFN5bmNfQUlDICU+JSBtdXRhdGUoTW9kZWxfTmFtZSA9IGZjdF9yZW9yZGVyKE1vZGVsX05hbWUsIC1BSUMpKSAlPiUgYXJyYW5nZShBSUMpCgpnZ3Bsb3QoU3luY19BSUMgJT4lIGFycmFuZ2UoQUlDKSwgYWVzKHggPSBNb2RlbF9OYW1lLCB5ID0gQUlDKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsKICB4bGFiKCIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSArCiAgdGhlbWVfbGlnaHQoKSsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgY29vcmRfZmxpcCgpCgpTeW5jX0FJQwpgYGAKCk5vdyB3ZSB1c2UgdGhlIGJlc3Qgb2YgdGhvc2UKYGBge3J9CnNwZWVkX2dhbSA8LSBzcGVlZF9nYW1fZHNhX2ZkYSA8LSBnYW0oU3BlZWRfRGlmZiB+IHMoRGlzdGFuY2Usc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKc3VtbWFyeShzcGVlZF9nYW0pCnZpcy5nYW0oc3BlZWRfZ2FtKQojIHNwZWVkX2dhbV92aXogPC0gZ2V0Vml6KHNwZWVkX2dhbSkKIyBwbG90UkdMKHNtKHNwZWVkX2dhbV92aXosIDEpKQoKY29zX2hlYWRpbmdfZ2FtIDwtIGdhbShjb3NfSGVhZGluZyB+IHMoRGlzdGFuY2UsY29zX0FuZ2xlLHNpbl9BbmdsZSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9uZWFyXzMpCnN1bW1hcnkoY29zX2hlYWRpbmdfZ2FtKQp2aXMuZ2FtKGNvc19oZWFkaW5nX2dhbSkKIyBjb3NfaGVhZGluZ19nYW1fdml6IDwtIGdldFZpeihjb3NfaGVhZGluZ19nYW0pCiMgcGxvdFJHTChzbShjb3NfaGVhZGluZ19nYW1fdml6LCAxKSwgZml4ID0gYygiRGlzdGFuY2UiID0gMCkpCgpzaW5faGVhZGluZ19nYW0gPC0gZ2FtKHNpbl9IZWFkaW5nIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKc3VtbWFyeShzaW5faGVhZGluZ19nYW0pCnZpcy5nYW0oc2luX2hlYWRpbmdfZ2FtKQojIHNpbl9oZWFkaW5nX2dhbV92aXogPC0gZ2V0Vml6KHNpbl9oZWFkaW5nX2dhbSkKIyBwbG90UkdMKHNtKHNpbl9oZWFkaW5nX2dhbV92aXosIDEpLCBmaXggPSBjKCJEaXN0YW5jZSIgPSAwKSkKCnN5bmNfZ2FtIDwtIGdhbShTeW5jIH4gcyhEaXN0YW5jZSxjb3NfQW5nbGUsc2luX0FuZ2xlLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX25lYXJfMykKc3VtbWFyeShzeW5jX2dhbSkKdmlzLmdhbShzeW5jX2dhbSkKIyBzeW5jX2dhbV92aXogPC0gZ2V0Vml6KHN5bmNfZ2FtKQojIHBsb3RSR0woc20oc3luY19nYW1fdml6LCAxKSwgZml4ID0gYygiRGlzdGFuY2UiID0gMCkpCmBgYAoKCk5vdyB3ZSBtYWtlIHNvbWUgcHJlZGljdGlvbnMgZm9yIHRoaXMuCmBgYHtyfQpkIDwtIHNlcShmcm9tID0gMCwgdG8gPSAzLCBieSA9IDAuMSkKYSA8LSBzZXEoZnJvbSA9IDAsIHRvID0gMTgwLCBieSA9IDUpCgpmbG93cyA8LSBjKCJGbG93IDAiLCAiRmxvdyAyIikKYWJsYXRpb24gPC0gYygiTm8gQWJsYXRpb24iLCAiQWJsYXRlZCIpCmRhcmsgPC0gYygiTGlnaHQiLCJEYXJrIikKCnByZWRpY3RfZGYgPC0gZXhwYW5kLmdyaWQoRGlzdGFuY2UgPSBkLCBBbmdsZSA9IGEsIEZsb3cgPSBmbG93cywgQWJsYXRpb24gPSBhYmxhdGlvbiwgRGFya25lc3MgPSBkYXJrKQoKcHJlZGljdF9kZiA8LSBwcmVkaWN0X2RmICU+JSBtdXRhdGUoRmxvd19BYmxhdGlvbl9EYXJrbmVzcyA9IGZhY3RvcihwYXN0ZShGbG93LEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoIShBYmxhdGlvbiA9PSAiQWJsYXRlZCIgJiBEYXJrbmVzcyA9PSAnRGFyaycpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocmFkX0FuZ2xlID0gZGVnMnJhZChBbmdsZSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzaW5fQW5nbGUgPSBzaW4ocmFkX0FuZ2xlKSwgY29zX0FuZ2xlID0gY29zKHJhZF9BbmdsZSkpCgpwcmVkaWN0X2RmIDwtIHByZWRpY3RfZGYgJT4lIG11dGF0ZShwcmVkX3NwZWVkX2RpZmYgPSBwcmVkaWN0LmdhbShzcGVlZF9nYW0scHJlZGljdF9kZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY29zX2hlYWRpbmdfZGlmZiA9IHByZWRpY3QuZ2FtKGNvc19oZWFkaW5nX2dhbSxwcmVkaWN0X2RmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF9zaW5faGVhZGluZ19kaWZmID0gcHJlZGljdC5nYW0oc2luX2hlYWRpbmdfZ2FtLHByZWRpY3RfZGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkX3N5bmMgPSBwcmVkaWN0LmdhbShzeW5jX2dhbSxwcmVkaWN0X2RmKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShBbmdsZSA9IHJhZDJkZWcoYXRhbjIoc2luX0FuZ2xlLGNvc19BbmdsZSkpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHByZWRfaGVhZGluZ19kaWZmID0gcmFkMmRlZyhhdGFuMihwcmVkX3Npbl9oZWFkaW5nX2RpZmYscHJlZF9jb3NfaGVhZGluZ19kaWZmKSkpCgpwcmVkaWN0X2RmX3N1bSA8LSBwcmVkaWN0X2RmICU+JSBncm91cF9ieShEaXN0YW5jZSxGbG93LEFibGF0aW9uLERhcmtuZXNzKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUobWVhbl9TcGVlZF9EaXN0YW5jZSA9IG1lYW4ocHJlZF9zcGVlZF9kaWZmKSwgc2RfU3BlZWRfRGlzdGFuY2UgPSBzZChwcmVkX3NwZWVkX2RpZmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX0hlYWRpbmdfRGlzdGFuY2UgPSBtZWFuKHByZWRfaGVhZGluZ19kaWZmKSwgc2RfSGVhZGluZ19EaXN0YW5jZSA9IHNkKHByZWRfaGVhZGluZ19kaWZmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbl9TeW5jX0Rpc3RhbmNlID0gbWVhbihwcmVkX3N5bmMpLCBzZF9TeW5jX0Rpc3RhbmNlID0gc2QocHJlZF9zeW5jKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KEFuZ2xlLEZsb3csQWJsYXRpb24sRGFya25lc3MpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShtZWFuX1NwZWVkX0FuZ2xlID0gbWVhbihwcmVkX3NwZWVkX2RpZmYpLCBzZF9TcGVlZF9BbmdsZSA9IHNkKHByZWRfc3BlZWRfZGlmZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fSGVhZGluZ19BbmdsZSA9IHJhZDJkZWcoYXRhbihtZWFuKHByZWRfc2luX2hlYWRpbmdfZGlmZikvbWVhbihwcmVkX2Nvc19oZWFkaW5nX2RpZmYpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkX0hlYWRpbmdfQW5nbGUgPSByYWQyZGVnKGF0YW4oc2QocHJlZF9zaW5faGVhZGluZ19kaWZmKS9zZChwcmVkX2Nvc19oZWFkaW5nX2RpZmYpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fU3luY19BbmdsZSA9IG1lYW4ocHJlZF9zeW5jKSwgc2RfU3luY19BbmdsZSA9IHNkKHByZWRfc3luYykpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKQpgYGAKCkFuZCBub3cgd2UgZ3JhcGggdGhvc2U/CgpgYGB7cn0KZ2dwbG90KHByZWRpY3RfZGZfc3VtLCBhZXMoeCA9IERpc3RhbmNlLCB5ID0gbWVhbl9TcGVlZF9EaXN0YW5jZSwgY29sb3IgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iICIpKSkgKwogIGdlb21fbGluZSgpICsKICAjZ2VvbV9wb2ludChkYXRhPXByZWRpY3RfZGYsIGFlcyh4ID0gRGlzdGFuY2UsIHkgPSBwcmVkX3NwZWVkX2RpZmYsIGFscGhhID0gMC4xNSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1lYW5fU3BlZWRfRGlzdGFuY2Utc2RfU3BlZWRfRGlzdGFuY2UsIHltYXggPSBtZWFuX1NwZWVkX0Rpc3RhbmNlK3NkX1NwZWVkX0Rpc3RhbmNlKSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gMCwKICAgICAgICAgICAgIGFscGhhID0gMC4xKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBEaXN0YW5jZSBhbmQgU2Vuc2VzIG9uIFNwZWVkIERpZmZlcmVuY2UiKSArCiAgeGxhYigiRGlzdGFuY2UgKEJMKSIpICsKICB5bGFiKCJTcGVlZCBEaWZmZXJlbmNlIChCTC9zKSIpICsKICAjeWxpbSgwLDEuNSkgKwogIHRoZW1lX2xpZ2h0KCkKCmdncGxvdChwcmVkaWN0X2RmX3N1bSwgYWVzKHggPSBEaXN0YW5jZSwgeSA9IG1lYW5fSGVhZGluZ19EaXN0YW5jZSwgY29sb3IgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICsKICBnZW9tX2xpbmUoKSArCiAgI2dlb21fcG9pbnQoZGF0YT1wcmVkaWN0X2RmLCBhZXMoeCA9IERpc3RhbmNlLCB5ID0gcHJlZF9oZWFkaW5nX2RpZmYsIGFscGhhID0gMC4xNSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1lYW5fSGVhZGluZ19EaXN0YW5jZS1zZF9IZWFkaW5nX0Rpc3RhbmNlLCB5bWF4ID0gbWVhbl9IZWFkaW5nX0Rpc3RhbmNlK3NkX0hlYWRpbmdfRGlzdGFuY2UpLAogICAgICAgICAgICAgIGxpbmV0eXBlID0gMCwKICAgICAgICAgICAgICBhbHBoYSA9IDAuMSkgKwogIGZhY2V0X3dyYXAofiBGbG93KSArCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIsIGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkNvbmRpdGlvbiIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMDAwMDAwIiwgIiM0Q0I5NDQiLCAiIzAwQTdFMSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBnZ3RpdGxlKCJFZmZlY3Qgb2YgRGlzdGFuY2UgYW5kIFNlbnNlcyBvbiBIZWFkaW5nIERpZmZlcmVuY2UiKSArCiAgeGxhYigiRGlzdGFuY2UgKEJMKSIpICsKICB5bGFiKCJIZWFkaW5nIERpZmZlcmVuY2UgKERlZ3JlZXMpIikgKwogICN5bGltKDAsNTApICsKICB0aGVtZV9saWdodCgpCgpnZ3Bsb3QocHJlZGljdF9kZl9zdW0sIGFlcyh4ID0gRGlzdGFuY2UsIHkgPSBtZWFuX1N5bmNfRGlzdGFuY2UsIGNvbG9yID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIikpKSArCiAgZ2VvbV9saW5lKCkgKwogICNnZW9tX3BvaW50KGRhdGE9cHJlZGljdF9kZiwgYWVzKHggPSBEaXN0YW5jZSwgeSA9IHByZWRfc3luYywgYWxwaGEgPSAwLjE1KSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWVhbl9TeW5jX0Rpc3RhbmNlLXNkX1N5bmNfRGlzdGFuY2UsIHltYXggPSBtZWFuX1N5bmNfRGlzdGFuY2Urc2RfU3luY19EaXN0YW5jZSksCiAgICAgICAgICAgICAgbGluZXR5cGUgPSAwLAogICAgICAgICAgICAgIGFscGhhID0gMC4xKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBEaXN0YW5jZSBhbmQgU2Vuc2VzIG9uIFN5bmNob25pemF0aW9uIikgKwogIHhsYWIoIkRpc3RhbmNlIChCTCkiKSArCiAgeWxhYigiU3luY2hvbml6YXRpb24iKSArCiAgI3lsaW0oMCwxKSsKICB0aGVtZV9saWdodCgpCmBgYApgYGB7cn0KZ2dwbG90KHByZWRpY3RfZGZfc3VtLCBhZXMoeCA9IEFuZ2xlLCB5ID0gbWVhbl9TcGVlZF9BbmdsZSwgY29sb3IgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICsKICBnZW9tX2xpbmUoKSArCiAgI2dlb21fcG9pbnQoZGF0YT1wcmVkaWN0X2RmLCBhZXMoeCA9IEFuZ2xlLCB5ID0gcHJlZF9zcGVlZF9kaWZmLCBhbHBoYSA9IDAuMTUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX1NwZWVkX0FuZ2xlLXNkX1NwZWVkX0FuZ2xlLCB5bWF4ID0gbWVhbl9TcGVlZF9BbmdsZStzZF9TcGVlZF9BbmdsZSksCiAgICAgICAgICAgICAgbGluZXR5cGUgPSAwLAogICAgICAgICAgICAgIGFscGhhID0gMC4xKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBCZWFyaW5nIGFuZCBTZW5zZXMgb24gU3BlZWQgRGlmZmVyZW5jZSIpICsKICB4bGFiKCJCZWFyaW5nIChEZWdyZWVzKSIpICsKICB5bGFiKCJTcGVlZCBEaWZmZXJlbmNlIChCTC9zKSIpICsKICB0aGVtZV9saWdodCgpCgpnZ3Bsb3QocHJlZGljdF9kZl9zdW0sIGFlcyh4ID0gQW5nbGUsIHkgPSBtZWFuX0hlYWRpbmdfQW5nbGUsIGNvbG9yID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIikpKSArCiAgZ2VvbV9saW5lKCkgKwogICNnZW9tX3BvaW50KGRhdGE9cHJlZGljdF9kZiwgYWVzKHggPSBBbmdsZSwgeSA9IHByZWRfaGVhZGluZ19kaWZmLCBhbHBoYSA9IDAuMTUpKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX0hlYWRpbmdfQW5nbGUtc2RfSGVhZGluZ19BbmdsZSwgeW1heCA9IG1lYW5fSGVhZGluZ19BbmdsZStzZF9IZWFkaW5nX0FuZ2xlKSwKICAgICAgICAgICAgICBsaW5ldHlwZSA9IDAsCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjEpICsKICBmYWNldF93cmFwKH4gRmxvdykgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiLCBjb2xvciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJDb25kaXRpb24iKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMDAwMDAwIiwgIiM0Q0I5NDQiLCAiIzAwQTdFMSIpKSArCiAgZ2d0aXRsZSgiRWZmZWN0IG9mIEJlYXJpbmcgYW5kIFNlbnNlcyBvbiBIZWFkaW5nIERpZmZlcmVuY2UiKSArCiAgeGxhYigiQW5nbGUgKERlZ3JlZXMpIikgKwogIHlsYWIoIkhlYWRpbmcgRGlmZmVyZW5jZSAoRGVncmVlcykiKSArCiAgdGhlbWVfbGlnaHQoKQoKZ2dwbG90KHByZWRpY3RfZGZfc3VtLCBhZXMoeCA9IEFuZ2xlLCB5ID0gbWVhbl9TeW5jX0FuZ2xlLCBjb2xvciA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSwKICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkgKwogIGdlb21fbGluZSgpICsKICNnZW9tX3BvaW50KGRhdGE9cHJlZGljdF9kZiwgYWVzKHggPSBBbmdsZSwgeSA9IHByZWRfc3luYywgYWxwaGEgPSAwLjE1KSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWVhbl9TeW5jX0FuZ2xlLXNkX1N5bmNfQW5nbGUsIHltYXggPSBtZWFuX1N5bmNfQW5nbGUrc2RfU3luY19BbmdsZSksCiAgICAgICAgICAgICAgbGluZXR5cGUgPSAwLAogICAgICAgICAgICAgIGFscGhhID0gMC4xKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBCZWFyaW5nIGFuZCBTZW5zZXMgb24gU3luY2hvbml6YXRpb24iKSArCiAgeGxhYigiQmVhcmluZyAoRGVncmVlcykiKSArCiAgeWxhYigiU3luY2hvbml6YXRpb24iKSArCiAgdGhlbWVfbGlnaHQoKQpgYGAKRGVuc2l0eSB2cyBUaGluZ3MKCgoKYGBge3J9CmRpc3RfYmluX3NpemUgPC0gMQphbmdsZV9iaW5fc2l6ZSA8LSAzMAoKY29tcF9kYXRhX2ZyZXFzIDwtIGNvbXBfZGF0YV9uZWFyXzMgJT4lIG11dGF0ZShEaXN0X2JpbiA9IHJvdW5kX2FueShEaXN0YW5jZSwgZGlzdF9iaW5fc2l6ZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZ2xlX2JpbiA9IHJvdW5kX2FueShBbmdsZSwgYW5nbGVfYmluX3NpemUpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KEZsb3csRGFya25lc3MsQWJsYXRpb24sIERpc3RfYmluLCBBbmdsZV9iaW4sRmxvd19BYmxhdGlvbl9EYXJrbmVzcykgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoQ291bnQgPSBuKCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoRmxvdyxEYXJrbmVzcyxBYmxhdGlvbixGbG93X0FibGF0aW9uX0RhcmtuZXNzKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShGcmVxID0gQ291bnQvbigpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KEZsb3csRGFya25lc3MsQWJsYXRpb24sRGlzdF9iaW4sQW5nbGVfYmluLEZsb3dfQWJsYXRpb25fRGFya25lc3MpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKFNwZWVkX0RpZmYgPSBtZWFuKFNwZWVkX0RpZmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRfSGVhZGluZ19EaWZmID0gYW5nX21lYW4oZm9sZF9oZWFkaW5nX2RpZmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmMgPSBtZWFuKFN5bmMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZXEgPSBtZWFuKEZyZXEpKQoKYGBgCgoKYGBge3J9CmZyZXFfc3BlZWRfZ2xtIDwtIGdsbShTcGVlZF9EaWZmIH4gRnJlcSooRmxvdytEYXJrbmVzcytBYmxhdGlvbitGbG93OkFibGF0aW9uK0Zsb3c6RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX2ZyZXFzKQoKc3VtbWFyeShmcmVxX3NwZWVkX2dsbSkKCmZyZXFfaGVhZGluZ19nbG0gPC0gZ2xtKEZvbGRfSGVhZGluZ19EaWZmIH4gRnJlcSooRmxvdytEYXJrbmVzcytBYmxhdGlvbitGbG93OkFibGF0aW9uK0Zsb3c6RGFya25lc3MpLCBkYXRhID0gY29tcF9kYXRhX2ZyZXFzKQoKc3VtbWFyeShmcmVxX2hlYWRpbmdfZ2xtKQoKZnJlcV9zeW5jX2dsbSA8LSBnbG0oU3luYyB+IEZyZXEqKEZsb3crRGFya25lc3MrQWJsYXRpb24rRmxvdzpBYmxhdGlvbitGbG93OkRhcmtuZXNzKSwgZGF0YSA9IGNvbXBfZGF0YV9mcmVxcykKCnN1bW1hcnkoZnJlcV9zeW5jX2dsbSkKCmZyZXFfc3BlZWRfZ2FtIDwtIGdhbShTcGVlZF9EaWZmIH4gcyhGcmVxLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gY29tcF9kYXRhX2ZyZXFzKQoKc3VtbWFyeShmcmVxX3NwZWVkX2dhbSkKCmZyZXFfaGVhZGluZ19nYW0gPC0gZ2FtKEZvbGRfSGVhZGluZ19EaWZmIH4gcyhGcmVxLGJ5PUZsb3dfQWJsYXRpb25fRGFya25lc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gY29tcF9kYXRhX2ZyZXFzKQoKc3VtbWFyeShmcmVxX2hlYWRpbmdfZ2FtKQoKZnJlcV9zeW5jX2dhbSA8LSBnYW0oU3luYyB+IHMoRnJlcSxieT1GbG93X0FibGF0aW9uX0RhcmtuZXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGNvbXBfZGF0YV9mcmVxcykKCnN1bW1hcnkoZnJlcV9zeW5jX2dhbSkKYGBgCgpOb3cgd2UgbWFrZSBzb21lIHByZWRpY3Rpb25zIGZvciB0aGlzLgpgYGB7cn0KZiA8LSBzZXEoZnJvbSA9IDAuMDA1LCB0byA9IDAuMDcsIGJ5ID0gMC4wMDEpCgpmbG93cyA8LSBjKCJGbG93IDAiLCAiRmxvdyAyIikKYWJsYXRpb24gPC0gYygiTm8gQWJsYXRpb24iLCAiQWJsYXRlZCIpCmRhcmsgPC0gYygiTGlnaHQiLCJEYXJrIikKCmZyZXFfcHJlZGljdF9kZiA8LSBleHBhbmQuZ3JpZChGcmVxID0gZiwgRmxvdyA9IGZsb3dzLCBBYmxhdGlvbiA9IGFibGF0aW9uLCBEYXJrbmVzcyA9IGRhcmspCgpmcmVxX3ByZWRpY3RfZGYgPC0gZnJlcV9wcmVkaWN0X2RmICU+JSBtdXRhdGUoRmxvd19BYmxhdGlvbl9EYXJrbmVzcyA9IGZhY3RvcihwYXN0ZShGbG93LEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcighKEFibGF0aW9uID09ICJBYmxhdGVkIiAmIERhcmtuZXNzID09ICdEYXJrJykpCgpmcmVxX3ByZWRpY3RfZGYgPC0gZnJlcV9wcmVkaWN0X2RmICU+JSBtdXRhdGUocHJlZF9zcGVlZF9kaWZmID0gcHJlZGljdC5nYW0oZnJlcV9zcGVlZF9nYW0sZnJlcV9wcmVkaWN0X2RmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF9oZWFkaW5nX2RpZmYgPSBwcmVkaWN0LmdhbShmcmVxX2hlYWRpbmdfZ2FtLGZyZXFfcHJlZGljdF9kZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfc3luYyA9IHByZWRpY3QuZ2FtKGZyZXFfc3luY19nYW0sZnJlcV9wcmVkaWN0X2RmKSkKCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoY29tcF9kYXRhX2ZyZXFzLCBhZXMoeCA9IEZyZXEsIHkgPSBTcGVlZF9EaWZmLCBjb2xvciA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSwKICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiB4Iiwgc2UgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofiBGbG93KSArCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIsIGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkNvbmRpdGlvbiIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMDAwMDAwIiwgIiM0Q0I5NDQiLCAiIzAwQTdFMSIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBnZ3RpdGxlKCJFZmZlY3Qgb2YgUHJlZmVyZW5jZSBhbmQgU2Vuc2VzIG9uIFNwZWVkIERpZmZlcmVuY2UiKSArCiAgeGxhYigiRnJlcXVlbmN5IG9mIE9ic2VydmF0aW9ucyIpICsKICB5bGFiKCJTcGVlZCBEaWZmZXJlbmNlIChCTC9zKSIpICsKICB0aGVtZV9saWdodCgpCgpnZ3Bsb3QoY29tcF9kYXRhX2ZyZXFzLCBhZXMoeCA9IEZyZXEsIHkgPSBGb2xkX0hlYWRpbmdfRGlmZiwgY29sb3IgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9ICJ5IH4geCIsIHNlID0gRkFMU0UpICsKICBmYWNldF93cmFwKH4gRmxvdykgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiLCBjb2xvciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJDb25kaXRpb24iKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMDAwMDAwIiwgIiM0Q0I5NDQiLCAiIzAwQTdFMSIpKSArCiAgZ2d0aXRsZSgiRWZmZWN0IG9mIFByZWZlcmVuY2UgYW5kIFNlbnNlcyBvbiBIZWFkaW5nIERpZmZlcmVuY2UiKSArCiAgeGxhYigiRnJlcXVlbmN5IG9mIE9ic2VydmF0aW9ucyIpICsKICB5bGFiKCJIZWFkaW5nIERpZmZlcmVuY2UgKERlZ3JlZXMpIikgKwogIHRoZW1lX2xpZ2h0KCkKCmdncGxvdChjb21wX2RhdGFfZnJlcXMsIGFlcyh4ID0gRnJlcSwgeSA9IFN5bmMsIGNvbG9yID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpLAogICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIikpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSAieSB+IHgiLCBzZSA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBQcmVmZXJlbmNlIGFuZCBTZW5zZXMgb24gU3luY2hvbml6YXRpb24iKSArCiAgeGxhYigiRnJlcXVlbmN5IG9mIE9ic2VydmF0aW9ucyIpICsKICB5bGFiKCJTeW5jaG9uaXphdGlvbiIpICsKICB0aGVtZV9saWdodCgpCmBgYAoKYGBge3J9CmdncGxvdChmcmVxX3ByZWRpY3RfZGYsIGFlcyh4ID0gRnJlcSwgeSA9IHByZWRfc3BlZWRfZGlmZiwgY29sb3IgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBGcmVxdWVuY3kgb2YgT2JzZXJ2YXRpb25zIG9uIFNwZWVkIERpZmZlcmVuY2UiKSArCiAgeGxhYigiRnJlcXVlbmN5ICglKSIpICsKICB5bGFiKCJTcGVlZCBEaWZmZXJlbmNlIChCTC9zKSIpICsKICB0aGVtZV9saWdodCgpCgpnZ3Bsb3QoZnJlcV9wcmVkaWN0X2RmLCBhZXMoeCA9IEZyZXEsIHkgPSBwcmVkX2hlYWRpbmdfZGlmZiwgY29sb3IgPSBpbnRlcmFjdGlvbihBYmxhdGlvbixEYXJrbmVzcyxzZXA9IiwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSkpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh+IEZsb3cpICsKICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQ29uZGl0aW9uIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiIzRDQjk0NCIsICIjMDBBN0UxIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIGdndGl0bGUoIkVmZmVjdCBvZiBGcmVxdWVuY3kgb2YgT2JzZXJ2YXRpb25zIG9uIEhlYWRpbmcgRGlmZmVyZW5jZSIpICsKICB4bGFiKCJGcmVxdWVuY3kgKCUpIikgKwogIHlsYWIoIkhlYWRpbmcgRGlmZmVyZW5jZSAoRGVncmVlcykiKSArCiAgdGhlbWVfbGlnaHQoKQoKZ2dwbG90KGZyZXFfcHJlZGljdF9kZiwgYWVzKHggPSBGcmVxLCB5ID0gcHJlZF9zeW5jLCBjb2xvciA9IGludGVyYWN0aW9uKEFibGF0aW9uLERhcmtuZXNzLHNlcD0iLCAiKSwKICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gaW50ZXJhY3Rpb24oQWJsYXRpb24sRGFya25lc3Msc2VwPSIsICIpKSkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKH4gRmxvdykgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiLCBjb2xvciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJDb25kaXRpb24iKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjNENCOTQ0IiwgIiMwMEE3RTEiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMDAwMDAwIiwgIiM0Q0I5NDQiLCAiIzAwQTdFMSIpKSArCiAgZ2d0aXRsZSgiRWZmZWN0IG9mIEZyZXF1ZW5jeSBvZiBPYnNlcnZhdGlvbnMgb24gU3luY2hvbml6YXRpb24iKSArCiAgeGxhYigiRnJlcXVlbmN5ICglKSIpICsKICB5bGFiKCJTeW5jaG9uaXphdGlvbiIpICsKICB0aGVtZV9saWdodCgpCmBgYAoKCg==